防止实体框架更新属性

时间:2016-11-21 04:33:30

标签: c# entity-framework

阻止我的CreatedOn属性被覆盖的最佳方法是什么,请参阅下文:

public class MyObject
{
   ...
   public DateTime? CreatedOn { get; set; }
   ...
}

我知道我可以将它传递给视图并使用隐藏的对象,但我不想依赖它。

我的更新方法如下所示:

var originalObject = db.Object.Find(model.objectId);

if (originalObject != null)
{
   ...
   db.Entry(originalObject).CurrentValues.SetValues(model);
   db.SaveChanges();
}

我试图阻止进行读取并单独设置每个属性。此外,我没有在绑定列表中列出CreatedOn方法,因此数据库中的值被NULL覆盖或抛出一个不能为NULL的错误,具体取决于我在属性设置中的方式该模型。

1 个答案:

答案 0 :(得分:4)

您可以使用属性IsModified来定义是否修改了特定的实体属性:

db.Entry(originalObject).CurrentValues.SetValues(model);
db.Entry(originalObject).Property(o => o.CreatedOn).IsModified = false;
db.SaveChanges();

设置为false时,不会在数据库中更新列。

如您所见,由于您要排除更多属性,因此需要编写更多代码。当添加一些新属性时,很容易忘记排除。因此,我建议在适当的地方使用视图模型。使用视图模型时,您使用的自定义对象仅具有对特定视图有意义的属性,而不是实体。在SO答案中,这是一个很大的主题,但您可以阅读good introduction主题。