我有一个动作方法,接收包含更新值的项目列表,事情是我只想更新几个字段(电子邮件或电话)而不是完整记录.下面的代码似乎做了我需要的但是有更好或更新的方法来使用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电子邮件地址和电话号码每次都被修改但实际上它将是一个或另一个,有没有办法只检测修改后的列/属性?
谢谢
最佳答案 附加可以用于您的目的,除非您已在上下文中拥有其中一个GenericTable项,在这种情况下它将抛出异常.
在上下文中查找对条目的搜索,如果找不到,则查询数据库以查找该条目并将其返回(从而将其附加到该过程中).
我会为整个表设置修改后的标志,如下所示:
foreach (var table in items)
{
gEntities.GenericTable.Attach(table);
gEntities.Entry<GenericTable>(table).State = EntityState.Modified;
}
当您调用SaveChanges()时,EF将检查修改了哪个属性并相应地更新.