【问题标题】:How do I map an inherited table with a composite key using Entity Framework code-first?如何使用实体框架代码优先使用复合键映射继承的表?
【发布时间】:2015-04-12 04:50:43
【问题描述】:

我有两个类,如下所示:

public class Customer {
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class CustomerChange : Customer {
    public DateTime ChangedAtUtc { get; set; }
}

我正在尝试使用实体框架代码优先将这些映射到数据库模式。架构应如下所示:

+-------------+
| Customer    |
+-------------|
| * Id        |
|   FirstName |
|   LastName  |
+-------------+
       |
       |
      /|\
  +----------------+
  | CustomerChange |
  +----------------+
  | * Id           |
  | * ChangedAtUtc |
  |   FirstName    |
  |   LastName     |
  +----------------+

所以Customer 表向您显示每个客户的 LATEST 状态,每次客户更改时,我们将 UPDATE Customer 表和 INSERT 一行插入 CustomerChange 表。 CustomerChange 为您提供该客户记录在一段时间内的完整历史记录 - 请注意,在此模型中应将 CustomerChanges 视为不可变的。

我尝试在 Customer.Id 和 CustomerChange.ChangedAtUtc 属性上都添加一个 [Key] 属性,但这不起作用。我已经尝试显式覆盖 OnModelCreating:

modelBuilder.Entity<CustomerChange>().Map(m => {
    m.MapInheritedProperties();
    m.ToTable("CustomerChanges");
}).HasKey(change => new { change.Id, change.ChangedAtUtc });

但我无法让 EF 使用复合键 (Id, ChangedAtUtc) 创建 CustomerChanges 表

(是的,在这个例子中,我依赖 id+timestamp 是唯一的。这很好。)

我应该如何装饰/覆盖各种实体框架位以正确创建此表?

【问题讨论】:

    标签: c# entity-framework orm ef-code-first composite-key


    【解决方案1】:

    我认为这应该可行。将 Customer 类定义为:

    //Customer class
    public class Customer
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    
        //Relationships
        public virtual ICollection<CustomerChange> CustomerChanges { get; set; }
    }
    
    //Mapping details for Customer
    public class CustomerMap : EntityTypeConfiguration<Customer>
    {
        public CustomerMap()
        {
            this.HasKey(c => c.Id);
        }
    }
    

    将 CustomerChange 定义为:

    //CustomerChange class
    public class CustomerChange
    {
        public int Id { get; set; }
        public DateTime ChangeDate { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    
        //Relationships
        public virtual Customer Customer { get; set; }
    }
    
    //Mapping details for CustomerChange class
    public class CustomerChangeMap : EntityTypeConfiguration<CustomerChange>
    {
        public CustomerChangeMap()
        {
            this.HasKey(c => new { c.Id, c.ChangeDate });
    
            //Relationship mappings
            this.HasRequired(cm => cm.Customer)
                .WithMany(c => c.CustomerChanges)
                .HasForeignKey(cm => cm.Id);
        }
    }
    

    然后在 OnModelCreating 处添加映射细节

    public override void OnModelCreating()
    {
        this.Configurations.Add(new CustomerMap());
        this.Configurations.Add(new CustomerChangeMap());
    }
    

    我希望它对你有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多