[转].NET Core之Entity Framework Core 你如何创建 DbContext
本文转自:http://www.cnblogs.com/tdws/p/5874212.html
本文版权归博客园和作者吴双共同所有,欢迎转载,转载和爬虫请注明博客园蜗牛原文地址 http://www.cnblogs.com/tdws/p/5874212.html。
目前国内各大论坛,各位大牛的分享,是按照Microsoft官方文档,在Web层直接应用EF Core。当然这并没有什么问题,因为我也要从文档开始分享。唯一多的一点就是在Dal层中调用DbContext的方法。你以前用的EF6.x,如果在测试代码中你可以直接new出来,在正式的项目开发中,你控制上下文线程内唯一时,也可以new一个对象。但是!在EF Core中你不能这样做。
在EF6.x中,你的上下文类中是这样的,在构造方法中没有任何参数。
你创建线程内唯一的上下文的方法也许是这样的。
回顾了EF6.x以及以前的版本,下面进入本篇分享的正文。英文官方文档地址https://docs.efproject.net/en/latest/platforms/aspnetcore/existing-db.html#
首先我新建了.NET Core WebApplication,ConsoleApp和几个.NET Core类库,暂且就先来一个BLL,DAL两个类库吧。
解决方案如下:
在类库和ConsoleApp和WebApi中都从nuget上安装好EF Core.SqlServer和design。你可以通过nuget可视化管理也可以通过nuget控制台命令。命令如下:
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.SqlServer.Design
另外你还需要使用如下命令安装tool。并且修改Dal层类库项目的project.json,增加tools节点。
Install-Package Microsoft.EntityFrameworkCore.Tools –Pre
"tools": {
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
}
由于是DB First,还要创建你的测试数据库,像下面这样。
下一步,在你想添加EF的Dal层的nuget控制台,执行以下命令,连接数据库的相关信息,别忘了修改:
Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=AppDb;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
这就是我的配置。
Scaffold-DbContext "Server=2013-20150707DJ\SQL2012EXPRESS;Database=AppDb;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
当然直接执行这段,你一定会遇到一个类似下面的错误。由于你的启动项目是Web,目前你还没有做项目应该具有的引用,所以它告诉你找不到DAL.dll。
解决办法当然就是UI引用BLL,BLL引用DAL,重新生成一下后再次执行该命令。还有如果提示让你dotnet restore一下,那你就执行一下。
成功之后你会发现DAL层中多了一个Model文件夹,并且将你的数据库表映射出实体类,另外还有DbContext类。
接下来看一下如何来处理你的DbContext。Miscrosoft告诉我们需要将如下代码做修改。
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
optionsBuilder.UseSqlServer(@"Server=2013-20150707DJ\SQL2012EXPRESS;Database=AppDb;Trusted_Connection=True;");
}
修改后是这样的:
//protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
//{
// #warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
// optionsBuilder.UseSqlServer(@"Server=2013-20150707DJ\SQL2012EXPRESS;Database=AppDb;Trusted_Connection=True;");
//}
public AppDbContext(DbContextOptions<AppDbContext> options)
: base(options)
{ }
在你的WebAPI或者你的MVC的Startup.cs做如下修改。在其ConfigureServices方法,添加以下代码,connection字符串依然要记得修改:
services.AddApplicationInsightsTelemetry(Configuration); var connection = @"Server=2013-20150707DJ\SQL2012EXPRESS;Database=AppDb;Trusted_Connection=True;"
执行如下添加代码,看起来和EF6.x没什么区别。唯一的区别就在于DbContext对象,通过.NET Core框架自动为我们做构造函数依赖注入IOC。
到此我们在Web/WebApi中操作dbContext成功。那么如果你要在Dal层操作,怎么办?这个_dbContext没有了依赖注入,谁来给我们对象?自己new一个,可是我们的构造函数摆在那里,不是单纯的New就可以操作了。
在你真正着手打算new一个的时候,你发现需要一个DbContextOption<AppDbContext>的对象。
那我们New一个DbContextOption<T>对象吧。你看到重载需要这个参数。
重载说道:你一般初始化一个实例使用重写DbContext.OnConfiguring方法,或者使用DbContextOptionBulider<T>来创建一个实例。由于我们所需对象为泛型DbContextOption<T>的对象,但是前者的重载方法并非泛型。也可能是我使用有误,如果你有好的实现,请留下建议。
1 public class UserDal
2 {
3 static string connection = @"Server=2013-20150707DJ\SQL2012EXPRESS;Database=AppDb;Trusted_Connection=True;";
4 static DbContextOptions<AppDbContext> dbContextOption = new DbContextOptions<AppDbContext>();
5 static DbContextOptionsBuilder<AppDbContext> dbContextOptionBuilder = new DbContextOptionsBuilder<AppDbContext>(dbContextOption);
6 AppDbContext _dbContext = new AppDbContext(dbContextOptionBuilder.UseSqlServer(connection).Options);
7 public int AddUser()
8 {
9 _dbContext.Users.Add(new Users { Name = "ws4", Email = "wscoder@outlook.com" });
10 return _dbContext.SaveChanges();
11 }
12 }
在ConsoleApp中调用,添加成功
如果我的点滴分享,对您有点滴帮助,欢迎点赞,也为你自己的收获点赞。
长期分享,欢迎点击下方关注。祝大家中秋快乐!
晚上喝个红牛又喝点茶,一直到凌晨五点钟也不困...腰疼。,有个研究生朋友经常和我说,你见过凌晨三点的西安吗?现在睡一觉,醒来去问问他见没见过凌晨五点的苏州。
最后我有个问题,EF Core目前支持Code First吗? 没看到相关文档。
EF Core如何保证上下文线程内唯一?没有CallContext...,也没办法用HttpContext.Current.Item,有人 操作过吗?
[转].NET Core之Entity Framework Core 你如何创建 DbContext的更多相关文章
- ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 Entity Fram ...
- Working with Data » Getting started with ASP.NET Core and Entity Framework Core using Visual Studio » 更新关系数据
Updating related data¶ 7 of 7 people found this helpful The Contoso University sample web applicatio ...
- Working with Data » Getting started with ASP.NET Core and Entity Framework Core using Visual Studio » 读取关系数据
Reading related data¶ 9 of 9 people found this helpful The Contoso University sample web application ...
- Working with Data » Getting started with ASP.NET Core and Entity Framework Core using Visual Studio »迁移
Migrations¶ 4 of 4 people found this helpful The Contoso University sample web application demonstra ...
- Working with Data » Getting started with ASP.NET Core and Entity Framework Core using Visual Studio » 创建复杂数据模型
Creating a complex data model 创建复杂数据模型 8 of 9 people found this helpful The Contoso University sampl ...
- Working with Data » Getting started with ASP.NET Core and Entity Framework Core using Visual Studio » 排序、筛选、分页以及分组
Sorting, filtering, paging, and grouping 7 of 8 people found this helpful By Tom Dykstra The Contoso ...
- Working with Data » Getting started with ASP.NET Core and Entity Framework Core using Visual Studio » 增、查、改、删操作
Create, Read, Update, and Delete operations¶ 5 of 5 people found this helpful By Tom Dykstra The Con ...
- 【EF Core】Entity Framework Core 批处理语句
在Entity Framework Core (EF Core)有许多新的功能,最令人期待的功能之一就是批处理语句.那么批处理语句是什么呢?批处理语句意味着它不会为每个插入/更新/删除语句发送单独的请 ...
- .NET Core之Entity Framework Core 你如何创建 DbContext
本文版权归博客园和作者吴双共同所有,欢迎转载,转载和爬虫请注明博客园蜗牛原文地址 http://www.cnblogs.com/tdws/p/5874212.html. 目前国内各大论坛,各位大牛的分 ...
- Oracle Data Provider for .NET – Microsoft .NET Core and Entity Framework Core
http://www.oracle.com/technetwork/topics/dotnet/tech-info/odpnet-dotnet-ef-core-sod-4395108.pdf Orac ...
随机推荐
- cinder create volume的流程-scheduler调度
创建 Volume 时,cinder-scheduler 会基于容量.Volume Type 等条件选择出最合适的存储节点,然后让其创建 Volume. 1.cinder-scheduler配置相关项 ...
- myeclipse2014 安装maven3.3.9和maven配置本地仓库 及错误修改
结合网上的知识梳理以及自己安装的经验 myeclipse2014 安装maven3.3.9和maven配置本地仓库 及犯的错误修改 成功搞定maven 1,安装 Maven 之前要求先确定你的 J ...
- BZOJ4650/UOJ219 [Noi2016]优秀的拆分
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- ObjectARX对话框添加颜色下拉组合框
建立Arx基本对话框,最好是基于CAcUidialog类. 首先添加combox控件更改一下属性: 先修改Owner Draw为Fixed,再更改Has Strings 为true Has Strin ...
- MySQL5.7配置(第一次使用)
MySQL5.7配置(第一次使用) 最近因为工作需要学习mysql的增删改查.用的公司的电脑,之前有人已经安装过mysql5.7,等于使用了免安装版,重新开始配置.参考了以下文章 http://blo ...
- SimpleDateFormat线程不安全及解决办法
原文链接:https://blog.csdn.net/csdn_ds/article/details/72984646 以前没有注意到SimpleDateFormat线程不安全的问题,写时间工具类,一 ...
- Javascript 中 的坑..
### 1. 0 == '' 返回 true 0 === '' 返回false......... 切记...
- C++_异常1-调用abort()
异常是相对较新的C++功能,有些老式编译器可能没有实现.另外有些编译器可能默认关闭这一特性,需要使用编译器选项来打开它. 这里先讨论一个基本问题: 2.0 * x * y / (x+y) 如果y是x的 ...
- openmpi-3.0.1超线程报错问题
先简单记录一下,虽然还有一些疑惑没有解决. 之前安装openmpi是用的命令安装,版本比较低,mfix并行总出现死锁问题,于是想看看是不是openmpi版本导致,虽然目前还未找到具体原因,但是先记录下 ...
- CF914E Palindromes in a Tree(点分治)
题面 洛谷 CF 题解 题意:给你一颗 n 个顶点的树(连通无环图).顶点从 1 到 n 编号,并且每个顶点对应一个在'a'到't'的字母. 树上的一条路径是回文是指至少有一个对应字母的排列为回文. ...