【问题标题】:EF Code-First inheritance & Primary Key problemEF Code-First 继承和主键问题
【发布时间】:2011-08-15 16:23:08
【问题描述】:

我正在尝试创建一个在我需要时自动添加审计跟踪表的功能。 它有点工作,但唯一的问题是审计表没有得到我指定的主键,它保留了之前指定的 ItemId 作为主键。

这是因为我在 ADepartment 中继承了 Department,并且已经在第一个 EntityTypeConfiguration 中指定了一个主键。我猜 EF 足够聪明,可以意识到这一点,但这不是我想要的。

有没有办法告诉第二个 EntityTypeConfiguration 它应该停止使用 ItemId 作为主键并开始使用 AuditId?

    public class Item
    {
        public int ItemId { get; set;}
    }

    public class Department : Item
    {
        public string Name { get; set; }           
    }

    public class ADepartment : Department, IAudit
    {        
        public int AuditId { get; set; }        
    }


    EntityTypeConfiguration<Department> cfg = new EntityTypeConfiguration<Department>();
    cfg.HasKey(p => p.ItemId);
    cfg.Map(p => p.MapInheritedProperties());                            
    cfg.ToTable(string.Format("Entity{0}", typeof(Department).Name));
    model.Configurations.Add<Department>(cfg);

    EntityTypeConfiguration<ADepartment> c = new EntityTypeConfiguration<ADepartment>();
    c.HasKey(p => p.AuditId);          
    c.Map(p => p.MapInheritedProperties());
    c.ToTable(string.Format("Audit{0}", typeof(ADepartment).Name));            
    model.Configurations.Add<ADepartment>(c);

【问题讨论】:

    标签: .net entity-framework ef-code-first


    【解决方案1】:

    不,没有办法做到这一点。继承层次结构中的实体必须共享一个关键属性。如果您需要不同的审计记录键,则需要不同的实体类型,该实体类型不是从原始类型继承的。使用继承类型进行审计会给你带来很多问题,所以无论如何你都应该这样做。例如:

    • 您的每个查询都必须使用OfType&lt;Department&gt;,否则您还将加载审计记录。
    • 延迟和急切地加载到Department 的关系将同时加载Department 和ADepartment - 除了使用OfType&lt;Department&gt; 显式加载外,没有办法避免这种情况

    【讨论】:

    • 谢谢。我决定使用一个接口,这两种类型都需要在审计表中使用我想要的字段来实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多