假设我的公司有员工名单:
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,并假设它需要添加到数据库中?)
这样做的正确方法是什么,以防止它创建重复项?
我是否需要首先检查公司是否已经存在,如果是的话,还要附上它?我的建议都不是很干净。
答案 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将知道它还必须更新公司和员工之间的引用。此代码还假定已启用员工的延迟加载。