簡體   English   中英

如何使用Entity Framework代碼優先映射帶有復合鍵的繼承表?

[英]How do I map an inherited table with a composite key using Entity Framework code-first?

我有兩個課,像這樣:

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; }
}

我正在嘗試使用Entity Framework代碼優先將它們映射到數據庫架構。 模式應如下所示:

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

因此, Customer表列出了每一個客戶的最新狀態,每一次客戶的變化,我們UPDATE Customer表和INSERT一行到CustomerChange表。 CustomerChange為您提供一段時間內該客戶記錄狀態的完整歷史記錄-請注意,在此模型中,CustomerChanges應該被認為是不變的。

我嘗試在[Key] .Customer屬性和[CustomerChange.ChangedAtUtc [Key]屬性上都放置[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是唯一的。這很好。)

我應該如何修飾/覆蓋各種實體框架位以正確創建此表?

我認為這應該有效。 將客戶類別定義為:

//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());
}

希望它對您有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM