ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 附加和更新boolean或int并不总是有效

2019-07-04 04:54:23  阅读:157  来源: 互联网

标签:c net entity-framework entity-framework-5


使用Entity Framework 5,给定一个存在于数据库中的对象信使,发布了比特属性,在以前版本的EF中,我会像这样更新它:

using (var c = new EFContext())
{
    Data.Messenger cm = new Messenger { MessageId = messageId };
    c.Messengers.Attach(cm);
    cm.Published = newPublishedValue;
    c.SaveChanges();
}

但是,如果newPublishedValue为true,则使用EF5,但如果newPublishedValue为false,则不对数据库进行任何更改.同样,此模式不会将整数值设置为0.

这里发生了什么?

更换

c.Messengers.Attach(cm);

c.Entry(cm).State = System.Data.EntityState.Modified;

修复了这个问题,但是如果EF5不会更新我的新Data.Messenger的属性,这些属性是默认的struct值,那么不会使Attach方法变得有点无用吗?

我在这里错过了什么?

解决方法:

它只适用于以前的版本,可能是因为您使用了从EntityObject或POCO派生的实体和动态代理更改跟踪.在这种情况下,属性设置器被重写,代码在您分配值(=调用setter)时为该属性设置Modified标志,无论旧值是什么.

使用没有动态变更跟踪代理的POCO它不起作用 – 对于没有EF版本 – 因为属性设置器只是实体类中数据字段的赋值.快照更改跟踪会发生更改跟踪,这意味着EF会将您调用Attach时实体的快照值与实体在调用SaveChanges时所具有的值进行比较.如果值未更改,则EF检测到没有更改,并且不会为该属性写入UPDATE语句.

Attach仅用于将实体添加到Unchanged状态的上下文中.在您的情况下,您必须将属性显式标记为已修改,以确保它将在数据库中更新,无论旧值是什么:

c.Entry(cm).Property(x => x.Published).IsModified = true;

标签:c,net,entity-framework,entity-framework-5
来源: https://codeday.me/bug/20190704/1373736.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有