zoukankan      html  css  js  c++  java
  • EntityFramework 更新数据库字段的三种方法(复习用)

    转自https://www.cnblogs.com/cuihongyu3503319/p/8671006.html

    例:

    实体类:

    复制代码
        public class TestDbContext : DbContext
        {
            public DbSet<Test> Tests { get; set; }
    
            public TestDbContext() : base() { }
        }
    
        public class Test
        {
            public long ID { get; set; }
    
            public string Name { get; set; }
            public string Email { get; set; }
            public string Remarks { get; set; }
        }
    复制代码

    创建数据库

                TestDbContext db = new TestDbContext();
                db.Tests.Add(new Test() { Name = "测试1", Email= @"123@abc.com", Remarks = "测试1备注"});
                db.Tests.Add(new Test() { Name = "测试2", Email = @"456@abc.com", Remarks = "测试2备注"});
                db.SaveChanges();

    更新数据 第一种方法:

    先查询记录,然后修改相应的属性。此方法虽然多了一个查询步骤,但是也由此利用了EF的自动跟踪功能,后续操作比较方便。

    比如,生成的SQL语句只会去修改相应的修改过的字段。

    而且经测试发现,如果实体属性值没有改变,不会生成SQL语句,比如将下面的代码执行两次,第二次 SaveChanges() 方法不会执行SQL更新语句(注:由于还是会执行一次查询,所以运行效率并没有显著提升)

                TestDbContext db = new TestDbContext();
                var test = db.Tests.Find(1);
                test.Remarks = "更新字段方法1";
    
                db.SaveChanges();

    第二种方法:

    直接创建一个新的实体类,然后修改实体对象的状态。此方法虽然少了一个查询步骤,但生成的SQL语句将会修改全部字段,而且还要确保 ID 值存在。(注意:由于会修改全部字段,没有设置的字段会被设置为null)

                TestDbContext db = new TestDbContext();
                Test test = new Test() { ID = 1, Remarks = "更新字段方法2" };
                db.Entry(test).State = System.Data.Entity.EntityState.Modified;
    
                db.SaveChanges();

    第三种方法:

    创建一个实体类,将实体附加到数据库上下文,然后修改相应属性值的修改标识为 true ,此方法生成的SQL语句与第一种方法一样,比较简洁,而且还少了查询步骤,只是后续的操作比较麻烦,因为要手动设置各个属性的修改标识,还要确保 ID 值存在。

                TestDbContext db = new TestDbContext();
                Test test = new Test() { ID = 1, Remarks = "更新字段方法3" };
                db.Tests.Attach(test);
                db.Entry(test).Property("Remarks").IsModified = true;
    
                db.SaveChanges();

    生成的SQL语句(使用 SQL Server Profiler 跟踪数据库所得): 第一种方法:(注:第一种方法的代码执行一次后再次执行没有跟踪到更新数据库的SQL语句)

    exec sp_executesql N‘UPDATE [dbo].[Tests]
    SET [Remarks] = @0
    WHERE ([ID] = @1)
    ‘,N‘@0 nvarchar(max) ,@1 bigint‘,@0=N‘更新字段方法1‘,@1=1

    第二种方法:(注:查看SQL语句可知,使用此方法如果不注意可能会导致数据被错误修改)

    exec sp_executesql N‘UPDATE [dbo].[Tests]
    SET [Name] = NULL, [Email] = NULL, [Remarks] = @0
    WHERE ([ID] = @1)
    ‘,N‘@0 nvarchar(max) ,@1 bigint‘,@0=N‘更新字段方法2‘,@1=1

    第三种方法

    exec sp_executesql N‘UPDATE [dbo].[Tests]
    SET [Remarks] = @0
    WHERE ([ID] = @1)
    ‘,N‘@0 nvarchar(max) ,@1 bigint‘,@0=N‘更新字段方法3‘,@1=1
  • 相关阅读:
    mysql 批量删除process
    python-argparse
    【声纹识别】matlab-辨别男女声
    python @装饰器
    【机器学习】大数定律,中心极限定律 极大似然估计
    【tensorflow】mnist-精简版模型
    Linux 的内存分页管理
    Python-内建函数
    Python-各种结构解析以及生成器(列表解析,字典解析,集合解析,元组构成的生成器)
    Python-模块之时间模块(time,datetime)
  • 原文地址:https://www.cnblogs.com/KQNLL/p/9425111.html
Copyright © 2011-2022 走看看