![](/img/trans.png)
[英]Adding a lookup entity without manually adding to related entities navigation properties
[英]Adding Related Entities without using navigation properties
我有以下類,設置為測試:
public class Company
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
}
public class Employee
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public int CompanyId { get; set; }
public virtual Company Company { get; set; }
}
public class EFTestDbContext : DbContext
{
public DbSet<Employee> Employees { get; set; }
public DbSet<Company> Companies { get; set; }
}
為了測試,我想通過單個SaveChanges調用為該公司插入一個公司和一個員工,如下所示:
Company company = new Company
{
Name = "Sample company"
};
context.Companies.Add(company);
// ** UNCOMMENTED FOR TEST 2
//Company company2 = new Company
//{
// Name = "Some other company"
//};
//context.Companies.Add(company2);
Employee employee = new Employee
{
Name = "Hans",
CompanyId = company.Id
};
context.Employees.Add(employee);
context.SaveChanges();
雖然我沒有使用導航屬性,但是我已經與Id建立了關系,這在某種程度上是神秘的 - 員工用適當的外鍵保存到公司,從0更新到實際價值,這讓我走了?!?! 一些隱藏的C#功能?
然后我決定添加更多代碼,在上面的代碼段中注釋,使其插入2 x Company實體和1 x Employee實體,然后我得到異常:
無法確定“CodeLab.EFTest.Employee_Company”關系的主要結尾。 多個添加的實體可以具有相同的主鍵。
這是否意味着在外鍵為0並且在同一個SaveChanges事務中插入單個匹配實體的情況下,實體框架將假定外鍵應該用於該匹配實體?
在第二個測試中,當有兩個實體匹配關系類型時,實體框架會拋出異常,因為它無法確定應該與哪個公司員工相關聯。
編輯:
我做了一個測試,並注釋掉了一行。 第一個測試仍然正常運行(因為int的默認值為0):
Employee employee = new Employee
{
Name = "Hans",
//CompanyId = company.Id // * no need for this at all
};
你並沒有真正觸及隱藏的C#功能,可能是一個不起眼的實體框架功能。
當您分配CompanyId
,EF知道Id = 0
(當時)的公司是員工的父母。 在許多情況下, EF執行DetectChanges
,它還執行關系 DetectChanges
:匹配外鍵值和引用。 執行時會發生這種情況
context.Employees.Add(employee);
現在EF將使用引用而不是外鍵值,因此它知道要在數據庫中存儲哪個FK值。
當您創建兩個公司時,有兩個實例具有相同的臨時鍵值,因此EF不能再選擇。
因此,當您想要存儲新的連接對象時,始終建議設置引用而不是FK值。
您將公司添加到公司表中。
context.Companies.Add(company);
然后設置員工的companyId:
CompanyId = company.Id
這是在sql中創建關系所需的全部內容。 可能實體框架插入了您的公司,然后使用生成的最后一個標識的companyId插入員工。
在這里我們可以看到當存在重復的enities時使用id存在問題。 在您的情況下,兩個公司的id都為0,直到它們被保存為止,因此實體框架無法唯一地標識公司。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.