gpt4 book ai didi

c# - 在不使用导航属性的情况下添加相关实体

转载 作者:行者123 更新时间:2023-11-30 14:10:26 24 4
gpt4 key购买 nike

我有以下类,设置用于测试:

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# 功能?

然后我决定添加更多代码,这在上面的代码片段中有注释,使其插入 2 x Company 实体和 1 x Employee 实体,然后我得到异常:

Unable to determine the principal end of the 'CodeLab.EFTest.Employee_Company' relationship. Multiple added entities may have the same primary key.

这是否意味着在外键为 0 的情况下,并且在同一 SaveChanges 事务中插入了一个匹配实体, Entity Framework 将假定外键应该用于该匹配实体?

在第二个测试中,当有两个实体匹配关系类型时, Entity Framework 会抛出异常,因为它无法确定员工应该与哪个公司相关。

编辑:

我又做了一项测试,并注释掉了一行。第一个测试仍然正常运行(因为 int 的默认值为 0):

Employee employee = new Employee
{
Name = "Hans",
//CompanyId = company.Id // * no need for this at all
};

最佳答案

您并没有真正触及隐藏的 C# 功能,可能是一个晦涩的 Entity Framework 功能。

当您分配 CompanyId 时,EF 知道 Id = 0 的公司(此时)是员工的父级。在很多场合,EF executes DetectChanges ,它还执行关系修复:匹配外键值和引用。当你执行时会发生这种情况

context.Employees.Add(employee);

现在 EF 将使用引用而不是外键值,因此它知道要将哪个 FK 值存储在数据库中。

当你创建两个公司时,有两个实例具有相同的 transient 键值,因此 EF 无法再选择。

所以当你想存储新连接的对象时,总是建议设置引用而不是 FK 值。

关于c# - 在不使用导航属性的情况下添加相关实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24090388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com