2015-02-11 35 views
1

我有兩個班,像這樣:如何使用實體框架代碼優先映射具有複合鍵的繼承表?

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表列出了每一個客戶的最新狀態,每一次客戶的變化,我們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表

(是的,在這個例子中,我依靠這是好的。)

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

回答

1

我認爲這應該工作。 Defince 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); 
    } 
} 

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

我希望它會爲你工作添加映射詳細信息。

相關問題