当表的所有字段都不可为空但具有默认值时,我怎么才能更新当时字段的一部分

时间:2012-08-23 09:12:46

标签: entity-framework-4 nullable default-value

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);
    }

1 个答案:

答案 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。