3

我需要創建一個關係,我有一個鏈接到地址表的用戶表。問題是我需要地址表來存儲歷史地址。用戶也可能根本沒有地址。實體框架4.1代碼優先 - 如何在兩個表之間創建兩個不同的關係

public class user 
{ 
    public virtual int ID { get; set; } 
    ... 
    public virtual int? AddressId { get; set; } 

    [ForeignKey("AddressId")] 
    public virtual Address CurrentAddress { get; set; } 

    public virtual ICollection<Address> HistoricAddresses { get; set; } 
} 

public class Address 
{ 
    public virtual int ID { get; set; } 
    ... 
} 

我想盡各種辦法來得到這個工作,得到了各種錯誤,如把用戶和地址之間的另一個表:

public class HistoricAddress 
{ 
    public virtual int ID { get; set; } 
    public Address HistoricAddress { get; set; } 
} 

public class user 
{ 
    public virtual int ID { get; set; } 
    public virtual Address CurrentAddress { get; set; } 
    public virtual ICollection<HistricAddress> HistoricAddresses { get; set; } 
    ... 
} 

等各種方式,但是這也引發了錯誤。必須有一個適當的方式來做到這一點。我得到的最後一個錯誤是:

「System.Data.Entity.Infrastructure.DbUpdateException:更新條目時發生錯誤,請參閱內部異常的詳細信息---> System.Data.UpdateException:發生錯誤 - > System.InvalidOperationException:ReferentialConstraint中的依賴屬性映射到商店生成的列,Column:'ID'。「

+0

你的第一個代碼片段有什麼問題? Code-First約定應該在沒有進一步配置的情況下正確映射'User'和'Address'之間的兩個關係,不是嗎? – Slauma

回答

4

您可以將以下模型映射到3個表格。

public class user 
{ 
    public virtual int ID { get; set; } 
    ... 
    public virtual int? AddressId { get; set; } 

    public virtual Address CurrentAddress { get; set; } 

    public virtual ICollection<Address> HistoricAddresses { get; set; } 
} 

public class Address 
{ 
    public virtual int ID { get; set; } 

    public virtual ICollection<User> Users { get; set; } 
    ... 
} 

覆蓋您的自定義的OnModelCreating方法創建DbContext

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<User>() 
     .HasOptional(user => user.CurrentAddress).WithMany() 
     .HasForeignKey(user => user.AddressId); 

    modelBuilder.Entity<User>() 
     .HasMany(user => user.HistoricAddresses) 
     .WithMany(address => address.Users) 
      .Map(m => 
      { 
       m.ToTable("UserAddresses"); 
       m.MapLeftKey("UserId"); 
       m.MapRightKey("AddressId"); 
      }); 
} 

表是

  • 用戶
  • 地址
  • UserAddresses
+0

您是不是指兩張桌子,因爲我看不到第三張桌子在哪裏。我也有第二個流利api映射的問題(.HasForeignKey不支持多對多關係)。我嘗試了沒有.HasForeignKey,但運行代碼時得到了與我在文章中提到的相同的錯誤。 – JohnCambell

+0

@JohnCambell第三個表是'UserAddresses'。 '.HasForeignKey'是錯誤添加的。請看我更新的答案。 – Eranga

+0

現在得到了第三張桌子,我在想實體。 – JohnCambell

相關問題