2017-06-27 89 views
0

假設我有一個公司與員工的名單:EF6 - 它屬於一個已經堅持實體添加新的實體

public class Company 
{ 
    public List<Employee> Employees { get; set; } 
} 

public class Employee 
{ 
    public string Name { get; set; } 
    public Company CompanyOfWork { get; set; } 
} 

我的公司已經存在的數據庫,但我需要保存一些僱員。

目前,我會遍歷員工,尋找它需要保存到數據庫新的(在我的情況下,ID = 0)的列表,並將其添加:

foreach(var employee in company.Employees) 
{ 
    if(employee.ID == 0) 
     db.Employees.Add(employee); 
} 

這就造成了新員工在數據庫中,但它也在DB中創建了公司的重複記錄(大概是因爲EF查看員工上的CompanyOfWork,並且假定它需要添加到數據庫?)

這是做什麼的正確方法防止它創建重複?

我是否需要先檢查公司是否已經存在,如果存在,請附上它?我的建議沒有感覺很乾淨。

回答

1

員工直接添加到現有的公司,然後保存該公司,而不是將它們添加到DbSet:

var existingCompany = db.Companies.Find(companyId); 
foreach (var employee in employeesToAdd) { 
    if (! existingCompany.Employees.Contains(employee)) { 
     existingCompany.Employees.Add(employee); 
    } 
    else { 
     // update existing employee ... 
    } 
} 
db.SaveChanges(); 

EF ChangeTracker就會知道,它也有更新企業和員工之間的引用,如果關係爲持久實體建模正確。此代碼還假定啓用員工的延遲加載。

+0

謝謝你。這是否意味着當你有一個非常複雜的對象時,你需要:遍歷所有實體,檢查它們是否存在 - 如果不存在,則添加它們,如果它們存在,則標記爲已更新。如果它們是新的並且屬於父級,則在數據庫中查找()父級,然後添加它們。我很驚訝地保存一個複雜的對象是多麼的尷尬,有沒有一個具體的例子來說明它是如何整齊地完成的? – FBryant87

+0

那麼你只需要檢查你是否必須添加,更新或刪除;如果您更新它,ChangeTracker將自動將實體標記爲髒。在我的公司,我們通過爲創建,更新和刪除提供明確的端點將此檢查移至另一圖層。如果您想創建父母與子女之間的關係,只需將其添加到父級。如果關係已經存在,您可以直接通過它的ID獲取員工,更新它,一切都會很好。對於獨立實體,您只需將它們直接添加到DbSet中,就像您在原始文章中完成的那樣。 –

+0

經過進一步測試,我們已經意識到Find()方法不會拋出錯誤 - 但也不會向數據庫添加任何內容。如果包含「db.Entry(employee)= EntityState.Added」,它會將數據添加到數據庫中,但這會再次產生重複數據。任何想法,如果有一些簡單的我們失蹤了? (我正在使用上面的確切方法) – FBryant87