gpt4 book ai didi

c# - 防止 Entity Framework 为导航属性插入值

转载 作者:可可西里 更新时间:2023-11-01 07:49:30 25 4
gpt4 key购买 nike

我正在使用 Entity Framework 4.0 开发 WPF 应用程序。保存对象时出现主键异常,但主键是AutoIncremented字段,无法理解异常原因。

所以在尝试了这个和那个之后,进行了一些调试并使用了 SQL 探查器,我发现在插入我的对象之前,必须在父表中插入一条记录,因为我设置了该对象的导航属性。

所以关键是如果尝试插入 Employee 对象并将其部门设置为 Employee.Department = deptObject,那么将在部门对象上插入一条新记录。

请以某种方式向我建议导航属性对象不会被插入到数据库中,任何属性或任何方法,任何东西。

谢谢

最佳答案

如果您错误地使用分离的实体,这就是 EF 的工作方式。我想你正在使用这样的东西:

var employee = new Employee();
employee.Department = GetDepartmentFromSomewhere(departmentId);

...

using (var context = new YourContext())
{
context.Employees.AddObject(employee);
context.SaveChanges();
}

此代码准备员工实体,添加对现有部门的引用并将新员工保存到数据库中。问题出在哪里?问题是 AddObject 不仅添加了员工,还添加了整个对象图。这就是 EF 的工作方式 - 您不能拥有对象图,其中部分对象连接到上下文而部分对象不连接。 AddObject 将图中的每个对象添加为一个新对象(新对象 = 插入数据库)。因此,您必须更改操作顺序或手动修复实体状态,以便您的上下文知道该部门已经存在。

第一个解决方案 - 加载部门和保存员工使用相同的上下文:

using (var context = new YourContext())
{
var employee = new Employee();
...
context.Employees.AddObject(employee);

employee.Department = context.Departments.Single(d => d.Id == departmentId);
context.SaveChanges();
}

第二种解决方案 - 将实体分别连接到上下文,然后在实体之间进行引用:

var employee = new Employee();
...

var department = GetDepartmentFromSomewhere(departmentId);

using (var context = new YourContext())
{
context.Employees.AddObject(employee);
context.Departments.Attach(department);
employee.Department = department;

context.SaveChanges();
}

第三种解决方案 - 手动更正部门状态,以便上下文不会再次插入它:

var employee = new Employee();
employee.Department = GetDepartmentFromSomewhere(departmentId);

...

using (var context = new YourContext())
{
context.Employees.AddObject(employee);
context.ObjectStateManager.ChangeObjectState(employee.Department,
EntityState.Unchanged);
context.SaveChanges();
}

关于c# - 防止 Entity Framework 为导航属性插入值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7884887/

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