簡體   English   中英

不使用導航屬性添加相關實體

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM