0

mysql 字段如下所示:

现有数据库上带有 mysql 的实体框架

我的应用程序是一个 mvc 4 项目,在现有数据库的 mysql 上使用 EF 4.4。

当表的所有字段都不可为空但具有默认值时,我如何只更新部分字段。当为部分字段创建或更新持久化到数据库时,EF 将自动为那些未明确指定的字段填充空值,并且我将收到异常。

我不想修改数据库。我能用这个做什么?谢谢你

编辑:

我的代码是这样的......您认为如何对其进行更改?

[HttpPost]
    public ActionResult Edit(Post_15 post)
    {
        if (ModelState.IsValid)
        {

            db.Entry(post).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(post);
    }
4

1 回答 1

1

您必须为您的对象提供默认值(例如在构造函数中)。EF 不能很好地使用数据库默认值。使用默认更新 EF 始终为每列发送显式值。当您发送显式值时,不使用数据库的默认值。如果您未在应用程序中设置属性值,.NET 默认值将发送到数据库。

或者,您必须以完全不同的方式处理更新。您必须明确设置要更新的列,以确保 EF 不会更新其他列。

var entity = new YourEntity {
    Id = 123,
    ColumnToUpdate = "ABC"
};

objectContext.Attach(entity);
ObjectStateEntry entry = objectContext.ObjectStateManager.GetObjectStateEntry(entity);
entry.SetModifiedProperty("ColumnToUpdate");
objectContext.SaveChanges();

ColumnToUpdate即使有 20 个其他持久属性,此代码也会更新。

编辑:

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。

于 2012-08-23T09:28:19.223 回答