【问题标题】:Entity framework - virtual table for multiple entities (code first)实体框架 - 多个实体的虚拟表(代码优先)
【发布时间】:2017-01-06 18:56:20
【问题描述】:

我们正在构建一个包含多个实体的上下文。所有实体都建立在具有 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 类的一组属性,一切正常。添加新日志条目时出现问题。

【问题讨论】:

  • 创建日志时会做什么?您是否尝试将其转换为 BaseEntity?也许还有一个类型值,以便您可以手动重铸回您的类型?
  • 或者你可以让它成为一个基于 GUID 的 getter?
  • 逻辑思考。你能在关系数据库中做这样的FK吗?

标签: entity-framework inheritance code-first


【解决方案1】:

我希望有一个可行且可行的解决方案,将公共字段抽象为基类。

在模型构建中使用 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);

我现在可以将“虚拟”表分配给任何实体,只要它们派生自基类。

【讨论】:

    猜你喜欢
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 2017-09-01
    • 2014-05-23
    • 1970-01-01
    相关资源
    最近更新 更多