EF Core
回滚最近的一次迁移记录
remove-migration 会报错

加参数remove-migration --force
一个程序集下面存在多个DbContext 指定DbContext进行迁移
add-migration --context XXXDbContext
一个事务中 先在数据库查出一条数据进行修改 然后在进行查询 他会直接在内存中找到这条数据 不会再数据库查询了

EF Core的 linq语句中可以使用C#方法或函数 在EF6或之前版本不可以

.Include() 在EF Core和 EF6中支持lamada表达式 之前的版本该方法只接受列名字符串
使用原生sql

FormSql已弃用
using (var dataContext = new SampleDbContext()) {
var query = dataContext.Categories.FromSqlRaw("select * from Category");
var result = query.ToList();
}
通过这种方式拼接sql 会自动拼接成带参数的sql语句
var query = dataContext.Categories.FromSql($"select * from Category where CategoryID={categoryID}");
执行存储过程
var query = dataContext.Categories.FromSql($"GetCategoryById {categoryID}");

配置一对一关系 在EF6.X或之前不支持
public class Student
{
public int Id { get; set; }
public string Name { get; set; } public StudentAddress Address { get; set; }
} public class StudentAddress
{
public int StudentAddressId { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Country { get; set; } public int StudentId { get; set; }
public Student Student { get; set; }
}
在Student表中自动产生一个AddressId列
订单行关联订单头可以省略前两行代码 直接写最后一行
public class SalesOrderLine : Entity<Guid>
{
/// <summary>
/// 销售订单ID
/// </summary>
public virtual Guid? SalesOrderId { set; get; }
/// <summary>
/// 销售订单
/// </summary>
[ForeignKey(nameof(SalesOrderId))]
public virtual SalesOrder SalesOrder { set; get; }
EF中已经有了默认的约定来实现一对多 如果想要自己写 可以扩展 Fluent API 这些一对多的配置在EF约定中就已经实现了 不需要自己配置 可以通过这个配置来实现级联删除
//配置订单头实体和订单行实体的关系
modelBuilder.Entity<SalesOrder>()
//订单头实体对象包含了 多个的订单行
.HasMany<SalesOrderLine>(t => t.Lines)
//订单行实体对象包含了 唯一的个订单头
.WithOne(g => g.SalesOrder)
//通过行的SalesOrderId属性进行关联
.HasForeignKey(g => g.SalesOrderId); //反过来配置
modelBuilder.Entity<SalesOrderLine>()
//订单行实体对象包含了 唯一的订单头
.HasOne<SalesOrder>(t => t.SalesOrder)
//订单头实体对象包含了 多个订单行
.WithMany(g => g.Lines)
//通过行的SalesOrderId属性进行关联
.HasForeignKey(t => t.SalesOrderId);

级联删除
//级联删除
//前面的配置都一样 只要在最后加上OnDelete
modelBuilder.Entity<SalesOrder>()
.HasMany<SalesOrderLine>(t => t.Lines)
.WithOne(g => g.SalesOrder)
.HasForeignKey(g => g.SalesOrderId)
.OnDelete(DeleteBehavior.Cascade);
//Cascade 删除主实体时将删除从属实体
//ClientSetNull 删除主实体时将从属实体的的外键属性值设置为null
//Restrict 防止级联删除
//SetNull 删除主实体时将从属实体的的外键属性值设置为null
多对多的关系只能自己配置
Entity Framework Core中没有可自动配置多对多关系的默认约定。您必须使用Fluent API对其进行配置。
学生表
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; } public IList<StudentCourse> StudentCourses { get; set; }
}
课程表
public class Course
{
public int CourseId { get; set; }
public string CourseName { get; set; }
public string Description { get; set; } public IList<StudentCourse> StudentCourses { get; set; }
}
//通过一张中间表来实现学生跟课程的多对多关系
public class StudentCourse
{
public int StudentId { get; set; }
public Student Student { get; set; } public int CourseId { get; set; }
public Course Course { get; set; }
}
关系配置
modelBuilder.Entity<StudentCourse>().HasKey(sc => new { sc.StudentId, sc.CourseId });
获取当前跟踪的所有实体
context.ChangeTracker.Entries()
可以使用 FromSql 扩展方法基于原生 SQL 查询开始 LINQ 查询。
var blogs = context.Blogs
.FromSql("SELECT * FROM dbo.Blogs")
.ToList();
原生 SQL 查询可用于执行存储过程。
var blogs = context.Blogs
.FromSql("EXECUTE dbo.GetMostPopularBlogs")
.ToList();
单独配置给某一个实体添加租户过滤和软删除过滤
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>().Property<string>("TenantId").HasField("_tenantId"); // Configure entity filters
modelBuilder.Entity<Blog>().HasQueryFilter(b => EF.Property<string>(b, "TenantId") == _tenantId);
modelBuilder.Entity<Post>().HasQueryFilter(p => !p.IsDeleted);
}
指定当前实体框架Linq查询不应用任何模型级实体查询筛选器。 不应用配置的软删除过滤和租户过滤
blogs = db.Blogs
.Include(b => b.Posts)
.IgnoreQueryFilters()
.ToList();
程序和数据库中对应类型

关于在ABP中 是否手动写await customerRepository.UpdateAsync(cc); 更新这行代码的测试 (不写EF会自动监测到所有修改的字段 进行更新 , 写了会更新所有字段)
1.不写这行代码 让事务自动提交
在数据库监控日志中会产生两条sql语句记录 一条是查询 一条是更新 更新的语句只更新修改过的字段
2.写了这行代码
在数据库监控日志中只有一条sql语句记录 查询和更新是在一起的 但是更新了所有字段
关于ef的迁移文件
add-migration 通过对比DBContext中的实体和总快照文件来生成迁移文件
update-database 会查询__EFMigrationsHistory表中的迁移记录 知道了最后一次迁移记录 把这次一次之后的所有迁移文件都执行一遍
ModelSnapshot迁移快照文件 每次通过add-migration生成新的迁移文件的时候 会对比dbContext中的实体跟快照中的记录 以这个为标准来产生新的迁移文件
迁移文件 :通过对比DBContext中的实体和快照文件来生成迁移文件
当前迁移文件中有两个方法:一个是Up Up就是使用update-database是执行的代码段 Down是回滚迁移文件执行的代码段 Up跟Down的的代码段肯定是相反的 比如在Up中新增一张表 在Down中就是删除这张表
迁移文件下面还有一个.Designer的文件 执行当前迁移文件后的快照文件
创建新库的时候: 因为不存在迁移记录表 所以会把所有迁移文件按顺序执行一遍 如果有丢失的迁移文件 则可能报错 迁移失败
修改库:找到当前迁移表中记录的迁移文件 执行在这之后新增的所有迁移文件
自动迁移
dbContext.Database.EnsureCreated();//不存在数据库则执行迁移 不执行更新操作
dbContext.Database.Migrate();每次都执行迁移文件 有最新就更新
https://docs.microsoft.com/zh-cn/ef/core/saving/cascade-delete
http://www.entityframeworktutorial.net/efcore/querying-in-ef-core.aspx
EF Core的更多相关文章
- EF Core 数据库迁移(Migration)
工具与环境介绍 1.开发环境为vs 2015 2.mysql EF Core支持采用 Pomelo.EntityFrameworkCore.MySql 源代码地址(https://github. ...
- Asp.net Core 通过 Ef Core 访问、管理Mysql
本文地址:http://www.cnblogs.com/likeli/p/5910524.html 环境 dotnet Core版本:1.0.0-preview2-003131 本文分为Window环 ...
- EF Core 杂记
本系列文章,将介绍本人在学习和使用EF Core的过程中的收获与心得. 或许有的地方讲的错误 欢迎大家批评指出. 1.EF Core 数据库迁移(Migration)
- MySQL官方.NET Core驱动已出,支持EF Core
千呼万唤始出来MySQL官方.NET Core驱动已出,支持EF Core. 昨天MySQL官方已经发布了.NET Core 驱动,目前还是预览版,不过功能已经可用. NuGet 地址:https:/ ...
- EF Core 1.0 和 SQLServer 2008 分页的问题
EF Core 1.0 在sqlserver2008分页的时候需要指定用数字分页. EF Core1.0 生成的分页语句中使用了 Featch Next.这个语句只有在SqlServer2012的时候 ...
- EntityFramework Core技术线路(EF7已经更名为EF Core,并于2016年6月底发布)
官方文档英文地址:https://github.com/aspnet/EntityFramework/wiki/Roadmap 历经延期和更名,新版本的实体框架终于要和大家见面了,虽然还有点害羞.请大 ...
- EF Core CodeFirst实践 ( 使用MS SqlServer)
这里使用 MS SQLSERVER ,网上大多使用 SQLite 先来一个CodeFirst 新建项目 这里我们选择 ASP.NET Core Web Application (.NET Core) ...
- ASP.NET Core 开发-Entity Framework (EF) Core 1.0 Database First
ASP.NET Core 开发-Entity Framework Core 1.0 Database First,ASP.NET Core 1.0 EF Core操作数据库. Entity Frame ...
- ASP.NET Core 开发 - Entity Framework (EF) Core
EF Core 1.0 Database First http://www.cnblogs.com/linezero/p/EFCoreDBFirst.html ASP.NET Core 开发 - En ...
- 再谈EF Core内存数据库单元测试问题
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:在用EF Core的内存数据库进行单元测试的时候遇到"无法访问已释放的对象& ...
随机推荐
- Telerik UI for ASP.NET AJAX控件汉化方法
Telerik UI for ASP.NET AJAX控件功能十分强大,但原版是英文界面的,不方便一些用户使用. 和.NET的其他控件一样,可以通过资源文件来制作多语言版本. 下面看看安装完成后原始的 ...
- windows环境下MySQL mysql-5.7.17-winx64 (社区服务版,community server)安装教程
根据网上查询的资料显示,MySQ在版本5.7开始根目录下没有dada目录,需要额外的“初始化数据库”的操作自动生成data目录. 1. 下载地址: https://cdn.mysql.com// ...
- TX2-入门坑点-Ubuntu16.04任务栏消失
问题:安装cuda过程中出现任务栏消失,快捷键失效的现象. 解决方法:重装桌面无法解决,使用cssm无法解决,最后删除home目录下的 .cache文件夹重启后解决
- 限时免费 | 12月6日,广州保利洲际酒店,ABC Summit 2018云智峰会来了!
随着科技的迅猛发展,人工智能技术也逐渐取得了各个突破.自20世纪70年代以来,作为计算机学科的一个分支,人工智能就被列为世界三大尖端技术之一.近年来,阿尔法狗战胜世界第一柯洁,使人工智能再度迎来新的热 ...
- 在不同语言中static的用法
static (计算机高级语言) 编辑 像在VB,C#,C,C++,Java,PHP中我们可以看到static作为关键字和函数出现,在其他的高级计算机语言如FORTRAN.ALGOL.COBOL.BA ...
- 编写自定义django-admin命令
Django为项目中每一个应用下的management/commands目录中名字没有以下划线开始的Python模块都注册了一个manage.py命令,我们可以利用这点来自定制一个命令(比如运行该命令 ...
- java框架之SpringMVC(1)-入门&整合MyBatis
前言 SpringMVC简介 SpringMVC 是一个类似于 Struts2 表现层的框架,属于 SpringFramework 的后续产品. 学习SpringMVC的原因 SpringMVC 与 ...
- Ethzasl MSF源码阅读(3):MSF_Core和PoseMeasurement
1.MSF_Core的三个函数:ProcessIMU.ProcessExternallyPropagatedState和AddMeasurement MSF_Core维护了状态队列和观测值队列,这里需 ...
- node Sream
const fs = require('fs'); let readerStream = fs.createReadStream('input.txt'); let writerStream = fs ...
- nodejs 癞子麻将
'use strict'; var _ = require('lodash'); var quick = require('quick-pomelo'); var P = quick.Promise; ...