1

我正在尝试使用实体框架更新记录,但希望避免手动设置每个属性然后调用保存更改。我有一个此类绑定到数据表单的实例,该数据表单会在用户更改其所有属性时更新它们。我可以看到使用它的最好方法是将上下文中的对象设置为等于绑定到我的数据表单的对象,但这不起作用。我尝试从上下文中删除对象,然后添加数据表单绑定对象,但它创建了一个全新的记录(我预料到了这一点,但决定值得一试)。我假设上下文中有某种类型的标志用于检测记录是否是新行,或者不考虑用数据绑定对象(具有相同的 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 时,不需要做任何其他事情。我听说在内存中有一个数据上下文是不好的。或者如果我在 using 语句的上下文之外使用它只是不好?

4

2 回答 2

0

DbContext在内部跟踪每个实体的状态,因此它知道是否添加/更新/删除任何给定的实体。当您Add()将实体添加到上下文时,即使它可能已经有一个 id,它的默认状态是Added(可能是New,不确定),这会导致现有 id 被忽略并将新记录插入到数据库中。

您要做的是将已经存在的实体附加到 DbContext,然后让 DbContext 知道它将被视为现有实体,以便对其进行更新而不是插入。

您可以通过将给定实体的 DbContext 中的 EntityState 设置为Modified(默认情况下New将实体添加到 DbContext 时)来实现。

尝试这样的事情:

using (var context = new CIS_DEVEntities())
{
    context.Entry(this).State = EntityState.Modified;
    context.SaveChanges();
}
于 2013-08-07T05:51:18.673 回答
0

在您的编辑页面中,首先从数据库加载对象,这将导致您的表单字段全部填充数据库中的现有数据。当表单发布时,您的数据对象模型的所有值都将被设置。

于 2013-08-07T05:46:22.883 回答