C# 使用实体框架上下文更新记录而不手动设置属性
我试图使用实体框架更新记录,但希望避免手动设置每个属性,然后调用保存更改。我将这个类的一个实例绑定到一个数据表单,该数据表单在用户更改其所有属性时更新这些属性。我能看到的最好的使用方法是将上下文中的对象设置为与绑定到我的数据表单的对象相等,但这不起作用。我尝试从上下文中删除该对象,然后添加dataform绑定对象,但它创建了一个全新的记录(我预料到了这一点,但决定值得一试)。我假设上下文中有某种类型的标志,用于检测记录是否为新行,或者不考虑用数据绑定对象(具有相同的pk值)替换上下文对象不起作用C# 使用实体框架上下文更新记录而不手动设置属性,c#,entity-framework,C#,Entity Framework,我试图使用实体框架更新记录,但希望避免手动设置每个属性,然后调用保存更改。我将这个类的一个实例绑定到一个数据表单,该数据表单在用户更改其所有属性时更新这些属性。我能看到的最好的使用方法是将上下文中的对象设置为与绑定到我的数据表单的对象相等,但这不起作用。我尝试从上下文中删除该对象,然后添加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窗口本身上创建一个上下文对象,然后将数据表单绑定到从该上下文检索到的gangmemberbio对象。然后,当我调用save changes时,不需要执行任何其他操作。我听说在内存中有一个datacontext是不好的。。或者,如果我在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();
}
伟大的漂亮又优雅!网上没有一个例子显示这一点。它们都会编辑这些值,然后调用save changes。就我而言,编辑30多个属性会很烦人。很高兴我能帮上忙!另一种选择(虽然不是我在这种情况下会使用的),是使用类似的东西。@rossipedia我可以借用这篇旧文章吗。我可能错过了什么。如果您有两种方法,一种用于添加记录,另一种用于修改该记录、添加新记录和修改工时,但EF总是只修改它插入的第一个方法。@MZawg我不完全确定您到底遇到了什么。请随便问一个新问题!我很乐意看一看:)