2017-01-06 167 views
0

我们正在构建具有多个实体的上下文。所有实体都建立在带有ID(guid)的抽象类上。实体框架 - 多个实体的虚拟表(代码优先)

我们希望所有实体都与公共日志表有关系,但无法让EFCF了解由于命名而产生的关系。

public class Log { 
    public BaseEntity Entity {get;set;} 
    public Guid EntityID {get;set;} 
} 

public class Example : BaseEntity { 
    public virtual ICollection<Log> Logs {get;set;} 
} 

任何人都可以帮助一个模式,支持?我们已经尝试过抽象,设置OnModelCreating等,但由于没有支持的命名,所以一直出现模糊错误。如果我们添加这些;

[ForeignKey("EntityID")] 
public Example Example {get;set;} 
[ForeignKey("EntityID")] 
public Example5 Example5 {get;set;} 
[ForeignKey("EntityID")] 
public Example2 Example2 {get;set;} 

在Log类上的一组属性,一切工作正常。添加新的日志条目时发生问题。

+0

当你创建日志时你会做什么?你有没有尝试将它作为BaseEntity进行投射?也许是一个类型值,所以你可以手动重铸回你的类型? – MiltoxBeyond

+0

或者你可以让它只是一个基于GUID的getter? – MiltoxBeyond

+0

逻辑思考。你可以在关系数据库中创建这样的FK吗? –

回答

0

我会提出一个可行的解决方案,将通用字段抽象为一个基类。

在模型构建使用MapInheritedProperties()(跟着)

modelBuilder.Entity<Models.Example>().Map(x => x.MapInheritedProperties()); 

modelBuilder.Entity<Models.Log>() 
    .HasRequired(x => x.BaseEntity) 
    .WithMany(x => x.Logs) 
    .Map(x => 
    { 
     x.ToTable("Example"); 
     x.MapKey(new[] { "ID" }); 
    }) 
    .WillCascadeOnDelete(false); 

我现在可以分配“虚拟”表的任何实体,只要他们从基类派生。