我正在尝试使用Entity Framework更新记录,但希望避免手动设置每个属性,然后调用保存更改。我有一个这个类的实例绑定到一个dataform,当用户更改它时,它会更新所有属性。我可以看到使用它的最好的方法是将上下文中的对象设置为绑定到我的dataform的对象,但这不起作用。我尝试从上下文中删除对象,然后添加dataform绑定对象,但它创建了一个全新的记录(我期望这个,但决定尝试它是值得一试)。我假设在上下文中有一些类型的标志,用于检测记录是否是新行,考虑到使用数据绑定对象(具有相同的pk值)替换上下文对象这一事实不起作用。
using (var scope = new TransactionScope())
{
try
{
using (var context = new CIS_DEVEntities())
{
GangMemberBio bio = context.GangMemberBios.First(P => P.id == this.id);
bio = this; //this does not work.
context.SaveChanges();
}
//If the top code is successfully completed then the transaction will be commited
//if not this line will be skipped and execution will be given to the catch block
scope.Complete();
}
catch
{
}
}
编辑创意1 我想我可以在我的wpf窗口本身创建一个上下文对象,然后将dataform绑定到从这个上下文中检索到的gangmemberbio对象。然后当我调用保存更改时,不需要做任何其他事情。我听说在内存中有一个datacontext虽然很糟糕。或者如果我在using语句的上下文之外使用它会不好?
答案 0 :(得分:0)
在您的编辑页面中,首先从数据库加载对象,这将导致您的表单的字段全部填充数据库中的现有数据。当发布表单时,将设置数据对象模型的所有值。
答案 1 :(得分:0)
DbContext
在内部跟踪每个实体的状态,因此它知道是否添加/更新/删除任何给定的状态。当你Add()
一个实体到上下文时,即使它可能已经有一个id,它的默认状态是Added
(可能是New
,不确定),这会导致现有的id到被忽略并将新记录插入数据库。
您要做的是将现有实体附加到DbContext,然后让DbContext知道它将被视为现有实体,以便更新,而不是插入。
您可以通过将给定实体的DbContext中的EntityState设置为Modified
(默认情况下将实体添加到DbContext时为New
)。
尝试这样的事情:
using (var context = new CIS_DEVEntities())
{
context.Entry(this).State = EntityState.Modified;
context.SaveChanges();
}