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

Entity framework EF6-添加属于已持久化实体的新实体,entity-framework,entity-framework-6,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; } } 这会在数据库中创建新员工,但也会在数据库中创建公司的重复记录(可能是因为EF查看员

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

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

public class Employee
{
    public string Name { get; set; }
    public Company CompanyOfWork { get; set; }
}
这会在数据库中创建新员工,但也会在数据库中创建公司的重复记录(可能是因为EF查看员工的公司工作,并假设需要将其添加到数据库中?)

正确的方法是什么来防止它创建重复


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

将员工添加到现有公司,然后保存公司,而不是直接将他们添加到数据库集:

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将知道,如果为持久实体正确建模了关系,它还必须更新公司和员工之间的引用。此代码还假设启用了延迟加载员工。

谢谢。这是否意味着当您有一个非常复杂的对象时,您需要:检查所有实体,检查它们是否存在-如果不存在,则添加它们,如果存在,则标记为已更新。如果它们是新的并且属于父级,请在数据库中查找()父级,然后添加它们。我只是很惊讶保存一个复杂的对象是多么的笨拙,有没有一个具体的例子来说明它是如何做到整洁的呢;如果更新实体,ChangeTracker会自动将其标记为脏实体。在我的公司,我们通过为创建、更新和删除提供显式端点,将此检查移动到另一层。如果要在父级和子级之间创建关系,只需将其添加到父级。如果关系已经存在,您可以直接通过员工id获取员工,并对其进行更新,一切都会好起来。对于独立实体,您只需将它们直接添加到DbSet,就像您在原始文章中所做的那样。经过进一步测试,我们实际上意识到Find()方法不会抛出错误,但也不会向数据库添加任何内容。如果我们包含“db.Entry(employee)=EntityState.Added”,它会添加到数据库中,但这会再次生成重复项。如果我们缺少一些简单的东西,有什么想法吗?(我使用的是如上所述的精确方法)Hm公司和员工之间的关系建模是否正确?类似于
ModelBuilder.Entity().HasMany(c=>c.Employees)。WithRequired(e=>e.CompanyOfWork)。WillCascadeOnDelete(true)啊,这是专门针对代码优先方法的吗?我们采用了DB优先的方法。
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();