4

我有一个接收包含更新值的项目列表的操作方法,问题是我只想更新几个字段(电子邮件或电话)而不是完整记录。下面的代码似乎可以满足我的需要,但是是否有更好或更新的方法来使用 EF 5 来做到这一点?我有时会看到人们使用 .Find 而不是 Attach 等。

        public ActionResult Update(IEnumerable<GenericTable> items)
        {
            using (var gEntities = new genericEntities())
            {
                foreach (var GenericTable in items)
                {
                gEntities.GenericTable.Attach(GenericTable);
                gEntities.Entry(GenericTable).Property(x => x.EmailAddress).IsModified = true;
                gEntities.Entry(GenericTable).Property(x => x.PhoneNumber).IsModified = true;


            }
            gEntities.SaveChanges();

        }

在这里,我明确告诉 EF 电子邮件地址和电话号码每次都被修改,但实际上它会一个或另一个,有没有办法只检测修改的列/属性?

谢谢

4

1 回答 1

2

附加对于您的目的来说很好,除非您已经在上下文中拥有这些 GenericTable 项目之一,在这种情况下它将引发异常。Find 在上下文中搜索条目,如果找不到,它会在数据库中查询该条目并将其返回(从而将其附加到进程中)。

我会像这样为整个表设置修改后的标志:

foreach (var table in items)
{
    gEntities.GenericTable.Attach(table);
    gEntities.Entry<GenericTable>(table).State = EntityState.Modified;
}

当您调用 SaveChanges() 时,EF 将检查哪个属性被修改并相应更新。

于 2013-08-14T17:25:42.477 回答