mysql字段如下所示:
在存在数据库的情况下使用mysql的实体框架
我的应用程序是一个mvc 4项目,它使用带有现有数据库的mysql上的EF 4.4。
当表的所有字段都不可为空但具有默认值时,如何才更新then字段的一部分。 当为一部分字段创建或更新持久化到数据库时,EF将自动填充null到那些没有显式指定的字段,我将得到一个异常。
我不想修改数据库。我能用这个去做什么?谢谢
编辑:
我的代码就是这样......你认为如何改变它?
[HttpPost]
public ActionResult Edit(Post_15 post)
{
if (ModelState.IsValid)
{
db.Entry(post).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(post);
}
答案 0 :(得分:1)
您必须为对象提供默认值(例如在构造函数中)。 EF无法很好地使用数据库默认值。使用默认更新时,EF始终为每列发送显式值。发送显式值时,不使用数据库的默认值。如果未在应用程序中设置property的值,则将.NET缺省值发送到数据库。
或者,您必须以完全不同的方式处理更新。您必须显式设置要更新的列,以确保EF不会更新其他列。
var entity = new YourEntity {
Id = 123,
ColumnToUpdate = "ABC"
};
objectContext.Attach(entity);
ObjectStateEntry entry = objectContext.ObjectStateManager.GetObjectStateEntry(entity);
entry.SetModifiedProperty("ColumnToUpdate");
objectContext.SaveChanges();
即使有其他20个持久属性,此代码也只会更新ColumnToUpdate
。
编辑:
DbContext替代方案:
var entity = new YourEntity {
Id = 123,
ColumnToUpdate = "ABC"
};
dbContext.Entities.Attach(entity);
DbStateEntry<Entity> entry = dbContext.Entry(entity);
entry.Property(e => e.ColumnToUpdate).IsModified = true;
dbContext.SaveChanges();
附注:只有.NET 4.5支持将IsModified
设置为false。