阻止我的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的错误,具体取决于我在属性设置中的方式该模型。
答案 0 :(得分:4)
您可以使用属性IsModified
来定义是否修改了特定的实体属性:
db.Entry(originalObject).CurrentValues.SetValues(model);
db.Entry(originalObject).Property(o => o.CreatedOn).IsModified = false;
db.SaveChanges();
设置为false
时,不会在数据库中更新列。
如您所见,由于您要排除更多属性,因此需要编写更多代码。当添加一些新属性时,很容易忘记排除。因此,我建议在适当的地方使用视图模型。使用视图模型时,您使用的自定义对象仅具有对特定视图有意义的属性,而不是实体。在SO答案中,这是一个很大的主题,但您可以阅读good introduction主题。