none
Entity Framework 6.1.1 (DbFirst)无法更新bit字段? RRS feed

  • 问题

  • 数据表:

    CREATE TABLE [dbo].[Intros](
    	[Id] [int] IDENTITY(1,1) NOT NULL,
    	[Name] [nvarchar](50) NOT NULL,
    	[Content] [nvarchar](max) NULL,
    	[Sort] [int] NOT NULL,
    	[Enabled] [bit] NOT NULL
    )

    更新代码部分:

    using (var db = Data.Database.GetContext())
                {
                    var data = new Data.Intro { Id = Id };
                    db.Intros.Attach(data);
    
                    data.Name = Name;
                    data.Content = Content;
                    data.Sort = Sort;
                    data.Enabled = Enabled;
    
                    db.SaveChanges();
                }

    以上代码无法更新 Enabled 字段,其他字段都可以更新,通过SqlProfiler查看,Update语句中没并有包含 Enabled;

    同时测试了其他表的bit字段,问题依旧如此。

    环境是 Win10 Pro Build 10130, vs2013, .net 4.5, iisexpress

    2015年6月23日 16:28

答案

  • 感谢您的回答,之前在win7下使用没有发现这样的情况,我刚刚反复的调试,找到了可能的原因所在

    using (var db = Data.Database.GetContext())
                {
                    var data = new Data.Intro { Id = Id };
                    db.Intros.Attach(data);
                                    
                    data.Name = Name;
                    data.Content = Content;
                    data.Sort = Sort;
                    data.Enabled = Enabled;
    
                    // 由于默认初始化 Data.Intro 时,Enabled = false;
                    // 当设置 data.Enabled = true 的时候,是可以正常的更新;
                    // 如果设置 data.Enabled = false 时,生成的 Update 语句中就不再包含 Enabled 字段;
                    // 估计是EF在对 data 实例进行跟踪是发现新赋的值与原来的值一样,视为该字段没有被更新,所以就忽略掉了;
                    // 需要使用下面的代码来保证每次都包含更新,不过这样的方法并不是最好的
                    db.Entry(data).Property(x => x.Enabled).IsModified = true;
    
                    db.SaveChanges();
                }

    2015年6月24日 17:04

全部回复

  • Hello zhoulei.lan,

    >>以上代码无法更新 Enabled 字段,其他字段都可以更新,通过SqlProfiler查看,Update语句中没并有包含 Enabled

    由于没有你提到的win1 10130的环境,我分别在win8.1win10 9920/10074测试了你说的bit字段,但是我通过sql server profiler看到都与bit这个字段,都是更新了的,不是很确定这个case是否是有这个10130的系统环境引起的,我建议你可以在win8.1或其他版本的winodws操作系统上测试你下的程序,看是否会得到不同的结果。

    这是测试代码:

    using (WinRTDBContext db = new WinRTDBContext())
    
                {
    
                    var data = new Employee { EmployeeID = "1" };
    
                    db.Employees.Attach(data);
    
    
                    data.EmployeeHireDate = "s";
    
                    data.EmployeeName = "s";
    
                    data.EmployeeSex = "s";
    
                    data.EmployeeState = "s";
    
                    data.Enabled = false;
    
    
                    db.SaveChanges();
    
    
                }
    

    数据库用的是Sql Server 2012,之前数据库中enable字段是True, 在调用SaveChanges后,变成了false.

    如你的程序在其他版本的windows得到的是同样的结果,enable字段没有更新,如果可以的话,请把 你的项目上传到给我们。

    如果这是由于windows 10130引起的话,我建议你可以win10自带的feedback tool吧这个scenario发给win10 team.

    Regards.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年6月24日 7:12
    版主
  • 感谢您的回答,之前在win7下使用没有发现这样的情况,我刚刚反复的调试,找到了可能的原因所在

    using (var db = Data.Database.GetContext())
                {
                    var data = new Data.Intro { Id = Id };
                    db.Intros.Attach(data);
                                    
                    data.Name = Name;
                    data.Content = Content;
                    data.Sort = Sort;
                    data.Enabled = Enabled;
    
                    // 由于默认初始化 Data.Intro 时,Enabled = false;
                    // 当设置 data.Enabled = true 的时候,是可以正常的更新;
                    // 如果设置 data.Enabled = false 时,生成的 Update 语句中就不再包含 Enabled 字段;
                    // 估计是EF在对 data 实例进行跟踪是发现新赋的值与原来的值一样,视为该字段没有被更新,所以就忽略掉了;
                    // 需要使用下面的代码来保证每次都包含更新,不过这样的方法并不是最好的
                    db.Entry(data).Property(x => x.Enabled).IsModified = true;
    
                    db.SaveChanges();
                }

    2015年6月24日 17:04