回滚最近的一次迁移记录

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的更多相关文章

  1. EF Core 数据库迁移(Migration)

    工具与环境介绍 1.开发环境为vs 2015 2.mysql EF Core支持采用  Pomelo.EntityFrameworkCore.MySql   源代码地址(https://github. ...

  2. Asp.net Core 通过 Ef Core 访问、管理Mysql

    本文地址:http://www.cnblogs.com/likeli/p/5910524.html 环境 dotnet Core版本:1.0.0-preview2-003131 本文分为Window环 ...

  3. EF Core 杂记

    本系列文章,将介绍本人在学习和使用EF Core的过程中的收获与心得. 或许有的地方讲的错误 欢迎大家批评指出. 1.EF Core 数据库迁移(Migration)

  4. MySQL官方.NET Core驱动已出,支持EF Core

    千呼万唤始出来MySQL官方.NET Core驱动已出,支持EF Core. 昨天MySQL官方已经发布了.NET Core 驱动,目前还是预览版,不过功能已经可用. NuGet 地址:https:/ ...

  5. EF Core 1.0 和 SQLServer 2008 分页的问题

    EF Core 1.0 在sqlserver2008分页的时候需要指定用数字分页. EF Core1.0 生成的分页语句中使用了 Featch Next.这个语句只有在SqlServer2012的时候 ...

  6. EntityFramework Core技术线路(EF7已经更名为EF Core,并于2016年6月底发布)

    官方文档英文地址:https://github.com/aspnet/EntityFramework/wiki/Roadmap 历经延期和更名,新版本的实体框架终于要和大家见面了,虽然还有点害羞.请大 ...

  7. EF Core CodeFirst实践 ( 使用MS SqlServer)

    这里使用 MS SQLSERVER ,网上大多使用 SQLite 先来一个CodeFirst 新建项目 这里我们选择  ASP.NET Core Web Application (.NET Core) ...

  8. 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 ...

  9. 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 ...

  10. 再谈EF Core内存数据库单元测试问题

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:在用EF Core的内存数据库进行单元测试的时候遇到"无法访问已释放的对象& ...

随机推荐

  1. 转载关于Python Web后端开发面试心得

    先介绍下我的情况:通信背景,工作一年多不到两年.之前一直在做C++的MFC软件界面开发工作.公司为某不景气的国企研究所.(喏,我的工作经验很水:1是方向不对:2是行业有偏差).然后目前是在寻找Pyth ...

  2. Python网络编程-Socket简单通信(及python实现远程文件发送)

    学习python中使用python进行网络编程,编写简单的客户端和服务器端进行通信,大部分内容来源于网络教程,这里进行总结供以后查阅. 先介绍下TCP的三次握手: 1,简单的发送消息: 服务器端: i ...

  3. C#4.5-4.7学习总结

    4.5讲的是this关键字.它用于表示对当前实例的引用,它有三种用法,一是访问属性,解决与局部变量名称冲突问题,二是访问成员方法,在类中调用自己的成员方法,就是在一个方法中,通过this.方法名,调用 ...

  4. day5_函数的参数

    http://www.nnzhp.cn/archives/154 一.函数在调用的时候,可以传入参数,有形参和实参 形参: 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元 ...

  5. Spring MVC原理及配置详解

    Spring MVC概述: Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单.这些控制 ...

  6. 苹果 ios 微信浏览器界面 ajax 提交带 file 的 form 总是走error方法

    1. 问题 问题出在微信端,而且是苹果机的微信端(苹果你咋这么矫情,安卓正常).:代码还是之前的代码,貌似是苹果升级系统后部分版本出现的 BUG,后来证明确实跟 ios 版本有关,网上也找过类似的解决 ...

  7. 实验二《Java面向对象程序设计》的一点说明

    实验二<Java面向对象程序设计>的一点说明 本周的实验要求是: 完成实验二<Java面向对象程序设计>中的内容 其中Eclipse相关的内容参考Intellj IDEA 简易 ...

  8. java框架之SpringCloud(5)-Hystrix服务熔断、降级与监控

    前言 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败.不做任何处理的情况下,很容易导致服务雪崩. 服务雪崩:多个微服务之间调用的时候,假设 ...

  9. python 字节转换成图像

    python 字节转换成图像 使用base64 1.图片转成字节使用:  base64.b64encode() 2.字节转成图片: base64.b64decode() 图片字节串: iVBORw0K ...

  10. SystemParametersInfo调置壁纸、屏幕保护程序

    应用SystemParametersInfo函数可以获取和设置数量众多的windows系统参数.这个小程序就是运用了SystemParametersInfo函数来设置桌面的墙纸,而且程序可以让我们选择 ...