使用实体框架上下文更新记录,而不手动设置属性
本文关键字:属性 设置 新记录 实体 框架 上下文 更新 | 更新日期: 2023-09-27 18:26:50
我正在尝试使用实体框架更新记录,但希望避免手动设置每个属性,然后调用保存更改。我有一个这个类的实例绑定到一个数据表单,当用户更改它的所有属性时,它会更新它们。我能看到的使用它的最好方法是将上下文中的对象设置为与绑定到我的数据表单的对象相等,但这不起作用。我尝试从上下文中删除该对象,然后添加数据表单绑定对象,但它创建了一个全新的记录(我预料到了这一点,但决定值得尝试一下)。我假设上下文中有某种类型的标志,用于检测记录是否是新行,或者没有考虑到用数据绑定对象(具有相同的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窗口上创建一个上下文对象,然后将数据表单绑定到从这个上下文中检索到的gangmemberbio对象。然后,当我调用保存更改时,无需执行其他操作。我听说内存中有数据上下文是不好的。。或者,如果我在using语句的上下文之外使用它,那是不是很糟糕?
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();
}
在编辑页面中,首先从数据库加载对象,这将导致表单的所有字段都用数据库中的现有数据填充。当表单发布时,将设置数据对象模型的所有值。