2016-02-26 67 views
1
public class Customer 
{ 
    public int Id { get; set; } 

    public int AddressId { get; set; } 

    public virtual Address { get; set; } 
} 

public class Address 
{ 
    public int Id { get; set; } 

    public virtual Customer { get; set; } 
} 

客戶必須擁有強制地址。地址可能有也可能沒有客戶。 Address中的Customer導航屬性類似於「可空」。我在Customer.AddressId表中有一個唯一的索引。實體框架 - 流利API映射

有什麼辦法使用流利的API來做這個映射嗎?

編輯:

CREATE TABLE Address 
(
    Id   INT NOT NULL IDENTITY PRIMARY KEY, 
    AddressLine1 VARCHAR(50), 
) 

CREATE TABLE Customer 
(
    Id   INT NOT NULL IDENTITY PRIMARY KEY, 
    Name  VARCHAR(50) NOT NULL, 
    AddressId INT NOT NULL, 
    CONSTRAINT FK_Customer_Address FOREIGN KEY(AddressId) REFERENCES Address (Id) 
) 
+0

可能有http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx – daremachine

+0

我嘗試了所有的例子,但仍沒有得到...我認爲沒有辦法映射此 –

回答

1

我重新整和於數據庫的模型,並能記錄添加到客戶和地址表。

基本上,如果一個客戶只能有一個地址,那麼這意味着一個地址可以有0個或更多的客戶。 (不是0或1)。 但由於您的唯一性限制,地址始終只會以0或1個客戶記錄結束。但這是一個運行時間約束,EF在設計時不知道這一點。 (我認爲它不能完全掌握2路關係的唯一性規則),EF將地址 - 客戶建模爲0:N,並讓運行時處理N永遠不會超過1的事實。

這是因爲想到了記錄。

  1. 一個customerA記錄,需要有一個地址a記錄
  2. 的AddressB記錄可獨立插入地址表中。
  3. Customer表中的另一個CustomerC記錄需要明確具有Address記錄,並且此記錄需要AddressB或AddressC。 (由於唯一索引約束,它不能是AddressA)
  4. AddressD記錄可以獨立插入地址表中。

so AddressA有1個客戶記錄,AddressD有0個客戶記錄。

現在的問題是,您的SQL服務器知道客戶記錄只能有一個地址記錄,,並且該地址記錄必須是唯一的。

EF無法理解雙向意義上的唯一性部分。它知道客戶只需要一個地址,但不能強制該地址必須是唯一的。如果您嘗試插入已經屬於另一個客戶的地址的客戶,則基礎INSERT引發錯誤時,該錯誤自然會發生。由於唯一性約束,EF實際上在創建模型方面做得很好,在Customer和Address之間爲1:1。

但是因爲它不能雙向理解唯一性部分,所以它將多個客戶映射到單個地址。 (0或更多的客戶,而不是0或1)

所以,你的映射需要看起來像這樣:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Address>() 
      .HasMany(e => e.Customers) 
      .WithRequired(e => e.Address) 
      .WillCascadeOnDelete(false); 
    } 

這保證,使客戶能夠始終都需要有一個地址實體和地址有0或更多的客戶。 (在實踐中,由於唯一性約束,你總是最終只有0或1個客戶),但是你不能在EF中執行它。你需要總是獲取List<Customers>,它總是會有0或1個元素。

如果您嘗試手動修改映射並在Address和Customer(而不是0:N)之間具有可選的0:1關係,那麼EF會有點困惑並且由於某種原因開始拋出IDENTITY插入異常。不知道爲什麼。

,所以你可以用上面的測繪工作,並確信你永遠只有0或1的記錄,在List<Customers>

已經有功能要求完全理解雙方的獨特性方面(轉化爲我認爲的良好感知的關係代數)。 https://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1050579-unique-constraint-i-e-candidate-key-support

+0

{「當IDENTITY_INSERT設置爲OFF時,無法在表'地址'中爲標識列插入顯式值。」} –

+0

我不知道我是否可以清楚地解釋場景。客戶必須有強制性地址。地址可能有也可能沒有客戶。地址中的Customer導航屬性爲「可空」。我在Customer.AddressId表中有一個唯一的索引。 –

+0

你編輯的問題,以改變客戶的地址順序..不知道爲什麼我的答案是倒退..現在嘗試 –

-1
public class Customer 
{ 
    public int Id { get; set; } 
    public Address { get; set; } 
} 
public class Address 
{ 
    public int Id { get; set; } 
    public int? CustomerId { get; set; } 
    public virtual Customer { get; set; } 
} 
+0

這不是所提到的場景。 –