EF6 - 添加属于已持久实体的新实体

时间:2017-06-27 14:01:47

标签: entity-framework entity-framework-6

假设我的公司有员工名单:

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

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

我的公司已存在于数据库中,但我需要保存一些员工。

目前我会遍历Employees列表,寻找需要保存到DB的新的(在我的情况下,ID = 0),并添加它们:

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

这会在数据库中创建新的员工,但它也会在数据库中创建公司的重复记录(可能是因为EF在Employee上查看CompanyOfWork,并假设它需要添加到数据库中?)

这样做的正确方法是什么,以防止它创建重复项?

我是否需要首先检查公司是否已经存在,如果是的话,还要附上它?我的建议都不是很干净。

1 个答案:

答案 0 :(得分: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将知道它还必须更新公司和员工之间的引用。此代码还假定已启用员工的延迟加载。