1

我正在使用 DB first 方法,EF 4.1 和 DbContext POCO 代码生成。

我的数据库有一个多对多的关系,如下所示:

员工

员工ID

员工姓名

帐户

帐户ID

帐户名称

员工账户

员工ID

帐户ID

当我尝试更新员工并将他们的帐户分配更改为预先存在的帐户时会出现问题,所以我基本上这样做如下:

using(context)
{
  var query = from e in context.Employees.Include(f => f.Accounts)
              where e.EmployeeId == employeeId
              select;

  Employee emp = query.FirstOrDefault()
}

emp.EmployeeName = "Test";

emp.Accounts.Clear();

Account act = MethodThatLooksUpAccountByName("SomeAccountName");

emp.Accounts.Add(act);

using(context)
{
  context.Accounts.Attach(act);

  emp.State = EntityState.Modified;

  context.Employees.Attach(emp);

  context.SaveChanges();
}

正在生成的 SQL 正在对 [Employee] 表执行更新,对 [EmployeeAccount] 根本没有任何内容,没有删除没有插入。

4

1 回答 1

1

尝试删除(至少)最后一个Attach. 您也不需要将状态设置为,Modified因为您处于附加场景(emp从数据库加载)并且更改跟踪将识别发生了什么更改:

var query = from e in context.Employees.Include(f => f.Accounts)
            where e.EmployeeId == employeeId
            select;
Employee emp = query.FirstOrDefault()

emp.EmployeeName = "Test";
emp.Accounts.Clear();

Account act = MethodThatLooksUpAccountByName("SomeAccountName");
// next line is only necessary if MethodThatLooksUpAccountByName
// uses another context. If it uses the same context you can remove this line.
context.Accounts.Attach(act); 

emp.Accounts.Add(act);

context.SaveChanges();

我认为这应该有效。

更改问题中的代码后进行编辑:

第二个上下文执行自己的更改跟踪。因此,它不会识别您已删除帐户并添加了新帐户。它应该按以下方式工作:

using(...context...)
{
    var query = from e in context.Employees.Include(f => f.Accounts)
                where e.EmployeeId == employeeId
                select;

    Employee emp = query.FirstOrDefault()
}

Account act = MethodThatLooksUpAccountByName("SomeAccountName");

using(...context...)
{
    context.Employees.Attach(emp);
    context.Accounts.Attach(act);

    emp.EmployeeName = "Test";
    emp.Accounts.Clear();
    emp.Accounts.Add(act);

    context.SaveChanges();
}

我有感觉,这不是你想要的。您是否在与上一个上下文分离的状态下完成了员工的更改(清除旧帐户和添加新帐户)?多对多集合的问题在于,您必须Account在要清除或更改旧集合的上下文中加载或附加旧集合。无法通过设置任何标量属性或设置任何实体的状态来触发链接表上的任何 DELETE 或 INSERT 语句。只有检测到集合中的更改才会 EF 导致更新链接表。

于 2011-10-13T19:15:41.880 回答