码迷,mamicode.com
首页 > 其他好文 > 详细

003 Entity Framework Core 2.x P3 插入数据和简单查询

时间:2020-04-16 01:00:06      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:each   server   batch   targe   down   好的   cti   ide   orm   

003 Entity Framework Core 2.x P3 插入数据和简单查询

在Efcore规则下,实体类中,凡是以实体类名称+Id的形式或直接叫Id形势的变量,Ef默认它是主键,并会自动自增.

efcore上下文是需要释放的,所以我们在使用上下文的时候需要使用using来进行包裹.

在efcore中使用上下文的方式有两种

  1. 直接在using中new 出上下文实例.
  2. 使用asp.net 自带的容器,进行构造函数注入的方式来使用,那么我们就不在需要使用using来包裹,ef上下文实例了,因为asp.net core容器会自动释放该资源.

在asp.net core 中如果使用了AddContext方式来注入EFCore 那么会自动添加日志记录的功能,无需在另外应用.

EFCore Insert 操作

  • _context.Provinces.Add(Province);
    • MyContext开始追踪Province对象
  • _context.SaceChanges();
    • 检查所有MyContext正在追踪的对象
    • 读取每一个对象的状态
    • 生成SQL语句
    • 执行所有生成的SQL语句
    • 如果有返回数据的话,就获取这些返回数据

Insert 操作

批量 Insert 操作

数据源

 var province = new Province
 {
     Name = "北京",
     Population = 2_000_000
 };

 var province2 = new Province
 {
     Name = "上海",
     Population = 1_000_000
 };

 var province3 = new Province
 {
     Name = "关东",
     Population = 3_000_000
 };

添加追踪的方式1

this._context.Province.Add(province);
this._context.Province.Add(province2);
this._context.Province.Add(province3);

添加追踪的方式2

this._context.Province.AddRange(province,province2,province3);

添加追踪的方式3

this._context.Province.AddRange(new List<Province>
{
    province,province2,province
});

提交添加功能

 this._context.SaveChanges();

同时 Insert 两个不同的对象

数据源:

var province = new Province
{
    Name = "天津",
    Population = 8_000_000
};

var company = new Company()
{
    Name = "TaiDa",
    EstablishDate = new DateTime(1990,1,1),
    LegalPerson = "Secret Man"
};

添加

this._context.AddRange(province, company);

提交

this._context.SaveChanges();

批量操作的大小限制

  • 默认大小显示是由数据库Provider定的.
    • 例如Sql Server 是1000个命令
  • 如果超出该大小,那么超出的部分将作为另外的批次来执行.

如果想修改此限制也是可以的,我们可以在AddDbContext方法中,修改限制,代码如下:

 options.UseSqlServer(
                    _configuration.GetConnectionString("DefaultConnectionString"),
                    opts=>opts.MaxBatchSize(1000000));  //修改一次提交的命令的数量限制
            });

查询


//查询所有provinces表的数据
 var provinces = _context.Province.ToList();

 //带过滤条件的查询
 var provinces2 = _context.Province
     .Where(x => x.Name == "北京")
     .ToList();

 //使用Linq的方式查询
 var provinces3 = (from p in _context.Province
     where p.Name == "上海"
     select p).ToList();

值得注意的是,在进行.ToList()方法之前,无论是查询方法的方式(表达式树),还是Linq表达式的方式,都只是构建了一个查询表达式,并没有实际去查询数据库,我们可以理解成是在拼接sql的过程,只有执行到类似如.ToList()或者.ToDictionary()或者.ToArray()等方法的时候才会正在的发送生成好的sql脚本到数据库中去进行查询.

查询注意事项:

案例代码如下:

var provinces4 = _context.Province
    .Where(x => x.Name == "北京");

foreach (var province in provinces4)
{
    Console.WriteLine(province.Name);

    /*执行了一些耗时方法*/
}

上述代码的问题在于,变量provinces4此时只是相当于一个表达式树,在使用foreach对这个表达式树进行遍历时,此表达式树会生成相应的sql去请求数据库查询数据,但是如果这个foreach循环执行的时间比较长的话,会导致数据库连接长期处于被打开状态(引发数据库性能问题),此时如果有别的操作来,操作此表的话,就会出现一些意想不到的事情,所以在遍历之前,我们最好使用ToList()方法之类的方式,先将此表达式应对的数据查询到内存中(此处数据库连接就会被关闭掉),再对查询到数据进行处理.

  • 上述文档参考自
    [插入数据和简单查询]

003 Entity Framework Core 2.x P3 插入数据和简单查询

标签:each   server   batch   targe   down   好的   cti   ide   orm   

原文地址:https://www.cnblogs.com/HelloZyjS/p/12709575.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!