我有这两张桌子
我正在尝试在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
如何在保存之前更新客户端模型。
答案 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不会再次实例化。这样它就会使用相同的更改跟踪器。
希望这有帮助。