【发布时间】:2014-06-06 20:49:34
【问题描述】:
我有以下课程,用于测试:
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# 功能?
然后我决定添加更多代码,在上面的 sn-p 中进行了注释,使其插入 2 x Company 实体和 1 x Employee 实体,然后出现异常:
无法确定“CodeLab.EFTest.Employee_Company”关系的主体端。多个添加的实体可能具有相同的主键。
这是否意味着在外键为 0 并且在同一个 SaveChanges 事务中插入单个匹配实体的情况下,实体框架将假定外键应该用于该匹配实体?
在第二个测试中,当有两个实体与关系类型匹配时,Entity Framework 会抛出异常,因为它无法确定员工应该与哪个公司相关。
编辑:
我又做了一项测试,并注释掉了一行。第一次测试仍然正常运行(因为 int 的默认值为 0):
Employee employee = new Employee
{
Name = "Hans",
//CompanyId = company.Id // * no need for this at all
};
【问题讨论】:
-
您的最后一次编辑更好地证明了明确设置引用是绝对必要的。这可能会导致意外行为。甚至可以称其为错误。
标签: c# sql entity-framework