EF添加数据、查询数据

使用EF添加数据、查询数据

EF大数据批量处理----BulkInsert

EF更新数据库字段的三种方法

实体类

   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

EF添加记录时获取自增ID值

Entity Framework在将数据插入数据库时,如果主键字段是自增标识列,会将该自增值返回给实体对象对应的属性。

比如下面添加博客随笔至数据库的示例代码:

【EF】知识笔记
var blogPost = new BlogPost()
{
    Author = "博客园",
    Title = "程序员的网上家园"
};
using (BlogDbContext context = new BlogDbContext())
{
    context.BlogPosts.Add(blogPost);                
    context.SaveChanges();
    return blogPost.ID;
}
View Code

相关文章:

  • 2021-12-17
  • 2021-06-04
  • 2021-07-30
  • 2022-01-14
  • 2021-05-08
  • 2021-08-25
  • 2021-12-31
  • 2021-04-13
猜你喜欢
  • 2021-05-21
  • 2021-10-05
  • 2021-08-25
  • 2021-12-08
  • 2022-12-23
  • 2022-01-24
  • 2022-12-23
相关资源
相似解决方案