首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当表的所有字段都不能为空但有默认值时,我如何才能只更新部分字段?

当表的所有字段都不能为空但有默认值时,我如何才能只更新部分字段?
EN

Stack Overflow用户
提问于 2012-08-23 17:12:46
回答 1查看 837关注 0票数 0

mysql字段如下所示:

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

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

当表的所有字段都不能为空但有默认值时,我如何才能更新部分字段。当为部分字段创建或更新持久化到数据库时,EF将自动为那些未显式指定的字段填充null,我将得到一个异常。

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

编辑:

我的代码是这样的。在您看来,如何对其进行更改?

代码语言:javascript
复制
[HttpPost]
    public ActionResult Edit(Post_15 post)
    {
        if (ModelState.IsValid)
        {

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-23 17:28:19

您必须为对象提供默认值(例如,在构造函数中)。EF不能很好地处理数据库默认值。使用default update,EF总是为每一列发送显式值。当您发送显式值时,不使用数据库的默认值。如果不在应用程序中设置属性的值,则.NET的默认值为send to database。

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

代码语言:javascript
复制
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替代方案:

代码语言:javascript
复制
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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12088384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档