003 Entity Framework Core 2.x P3 插入数据和简单查询
在Efcore规则下,实体类中,凡是以实体类名称+Id的形式或直接叫Id形势的变量,Ef默认它是主键,并会自动自增.
efcore上下文是需要释放的,所以我们在使用上下文的时候需要使用using来进行包裹.
在efcore中使用上下文的方式有两种
- 直接在using中new 出上下文实例.
- 使用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"
};
添加
扫描二维码关注公众号,回复:
10833713 查看本文章
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()
方法之类的方式,先将此表达式应对的数据查询到内存中(此处数据库连接就会被关闭掉),再对查询到数据进行处理.
- 上述文档参考自
[插入数据和简单查询]