2013-01-21 54 views
1

我想模擬我認爲是一個基本的場景,但我無法讓我的頭在EF中定義它的正確方法代碼首先5.實體框架代碼第一個可選的一對一關係,沒有反向導航屬性

我有三類:

員工 郵政地址 聯繫電話號碼

的規則是這樣的:

  • 郵政地址可以是獨立的
  • 聯繫電話號碼可以是獨立的
  • 可選,員工可以有一個「家」郵政地址
  • 僱員可以有零個或更多的聯繫電話號碼

如果我在SQL中對此進行建模,那麼最終會有四個表格;

  • 的PostalAddress
  • ContactTelephoneNumber
  • 員工
  • EmployeeContactTelephoneNumber(表橋)

通過通過回答看這裏的話,我可以產生類似的Code First我的SQL模型的東西除了我必須在PostalAddress上有一個Employee導航屬性並且在ContactTelephoneNumber上有一個Employees導航屬性。這違背了我的業務規則,因爲PostalAddress和ContactTelephoneNumber都不會被認爲是員工。例如,我以後可以添加一個Premises類,它也會有一個PostalAddress。

通過代碼例子,我現在有類似以下內容:

public class Employee 
{ 
    public int EmployeeID {get;set;} 
    public virtual PostalAddress? HomeAddress {get;set;} 
} 

public class PostalAddress 
{ 
    public int PostalAddressID {get;set;} 
    public string Address {get;set;} // It's not actually a string - this is for brevity! 
} 

public class ContactTelephoneNumber 
{ 
    public int ContactTelephoneNumberID {get;set;} 
    public string TelephoneNumber {get;set;} // It's not actually a string - this is for brevity! 
} 

我試圖用流利的API,而不是註解,以確保我的表現層來定義我的關係仍然不知道實體的消費這些類時的框架。我的映射目前類似於以下內容 - 這是「正確的」嗎?

public class EmployeeMap : EntityTypeConfiguration<Employee> 
{ 
    public EmployeeMap() 
    { 
     this.HasOptional(e => e.HomeAddress).WithOptionalDependent(p => p.Value).Map(m  => m.MapKey("PostalAddressID")); 
    } 
} 

這不會編譯;我得到:

類型'PostalAddress?'必須是引用類型,以便在通用類型或方法「System.Data.Entity.ModelConfiguration.EntityTypeConfiguration.HasOptional(System.Linq.Expressions.Expression>)」

使用它作爲參數「TTargetEntity」另外,我不喜歡我將「PostalAddressID」作爲字符串常量傳遞給調用MapKey()。

請有人突出我的方式錯誤?我一直在尋找過去3個小時無濟於事!

編輯:我應該提到,一旦我理解了這部分,我將嘗試分別解決Employee> ContactTelephoneNumbers情況。

+0

你爲什麼使用PostalAddress?這是一個引用類型,所以它已經可以爲空。實際上,創建這種類型應該是不可能的。 – millimoose

+0

@millimoose - 我試圖找到一種解決我爲了迴應Morten的回答而描述的情況。我真誠地抓着吸管! –

回答

0

您已聲明HomeAddress爲值類型,具體爲Nullable<T>

刪除?從聲明中(引用類型允許null,因此不需要被包裝在Nullable結構中)。

public virtual PostalAddress HomeAddress {get;set;} 

要指定映射,我想你可以使用這個:

this.HasOptional(e => e.HomeAddress).WithMany().HasForeignKey(e => e.HomeAddressID); 

您還需要將HomeAddressID屬性添加到Employee類。

+0

感謝Morten,但是當我按照您的建議進行更改時,則必須在我的Lambda的PostalAddress類中爲WithOptionalDependant指定一個屬性。此屬性必須是Employee類型 - 這違反了我的有關PostalAddress的規則與Employee沒有關係,它們可以是獨立的。這是我混亂的根源! –

+0

@Daniel通過映射信息查看更新的答案。 –

+0

(編輯)我使HomeAddressID爲空,它似乎工作! –

相關問題