我想模擬我認爲是一個基本的場景,但我無法讓我的頭在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情況。
你爲什麼使用PostalAddress?這是一個引用類型,所以它已經可以爲空。實際上,創建這種類型應該是不可能的。 – millimoose
@millimoose - 我試圖找到一種解決我爲了迴應Morten的回答而描述的情況。我真誠地抓着吸管! –