更新有关在另一个表中创建新行的表

时间:2014-12-26 19:25:27

标签: c# asp.net-mvc entity-framework

我有这两张桌子  enter image description here

我正在尝试在Account表中添加一个新行,然后使用以下内容更新Client表中的AccountId:

public static void AddAccount ()
{
  var db = new DALEntities();
  Account account = new Account();

  db.Account.Add(account);
  db.SaveChanges();
  var newid = account.AccountId;
  if (MySession.Current._ClientId != null)
  {
      Client client = GetClientByID((int) MySession.Current._ClientId);
      client.AccountId = newid;

      db.SaveChanges();
  }
}

我使用以下内容获取客户端:

public static Client GetClientByID (int id)
{
    var db = new DALEntities();
    return db.Client.SingleOrDefault(d => d.ClientID == id);
}

新行被添加到Account表中,它返回正确的新条目AccountId和正确的Client对象;但是它不会更新Client表。我试着用

  db.Entry(client).State = EntityState.Modified;

但得到了这个错误:

an entity object cannot be referenced by multiple instances of ientitychangetracker

如何在保存之前更新客户端模型。

1 个答案:

答案 0 :(得分:2)

我看到你在这个上下文中实例化了一个新的DbContext:

public static Client GetClientByID (int id)
{
    var db = new DALEntities();
    return db.Client.SingleOrDefault(d => d.ClientID == id);
}

为了使其工作,您必须确保从相同的上下文中获取这两个实例。

实际上,您必须使“db”成为类级字段。或者,为了简单起见并证明它有效,您可以进行以下更改:

public static void AddAccount ()
{
  var db = new DALEntities();
  Account account = new Account();

  db.Account.Add(account);
  db.SaveChanges();
  var newid = account.AccountId;
  if (MySession.Current._ClientId != null)
  {
      Client client =  db.Client.SingleOrDefault(d => d.ClientID == id);
      client.AccountId = newid;

      db.SaveChanges();
  }
}

请注意,DALEntities不会再次实例化。这样它就会使用相同的更改跟踪器。

希望这有帮助。