[转].NET Core之Entity Framework Core 你如何创建 DbContext

news/2024/7/19 9:50:22 标签: 数据库, json, 爬虫

本文转自: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,有人 操作过吗?

 

转载于:https://www.cnblogs.com/freeliver54/p/6383044.html


http://www.niftyadmin.cn/n/820807.html

相关文章

四川大学计算机专业调剂,2019年四川大学计算机学院(软件学院)考研调剂信息

四川大学计算机学院(软件学院)2019年非全日制硕士研究生接收调剂的通知计算机学院(软件学院)现有部分非全日制硕士研究生生源&#xff0c;现需要接收调剂的学生&#xff0c;具体说明如下&#xff1a;一、接收调剂的专业及指标085211 计算机技术(非全日制) 36085212 软件工程(非…

Thymeleaf th:action

th:attr 任何属性值<form action"subscribe.html" th:attr"action{/subscribe}"><fieldset><input type"text" name"email" /><input type"submit" value"Subscribe me!" th:attr"valu…

html5 css3 世界地图,HTML5 CSS3南极的世界

CSS语言&#xff1a;CSSSCSS确定body {background: white;margin: 0;}.contenedor {padding-top: 30px;width: 100%;height: 850px;position: relative;background: #c8cacb;margin: 30px auto;overflow: hidden;}ul.mountains {display: block;width: 100%;height: 300px;list…

XML序列化器

//获取xml序列化器XmlSerializer xs Xml.newSerializer();File file new File("sdcard/sms2.xml");FileOutputStream fos;try {fos new FileOutputStream(file);//初始化//xml文件中什么编码生成xs.setOutput(fos, "utf-8");//开始生成xml文件//生成头结…

高校计算机水平能力联合测试成绩,全国高校计算机联合考试(广西考区)一级考试大纲.docx...

全国高校计算机联合考试(广西考区)一级考试大纲(2010年12月修订)全国高校计算机等级考试(广西考区)是与高校计算机基础教学密切结合的、面向高校非计算机专业学生的计算机水平考试&#xff0c;分为一级、二级、三级共三个等级。一级考试内容是高校所有专业学生必须学习的内容&a…

MD5加密的方法

#region MD5加密 /// <summary> /// MD5加密 /// </summary> /// <param name"strPwd"></param> /// <returns></returns> public string Encrypt(string strPwd) { String str ""; // 初始化MD5对象 MD5 md5 new …

在html中按钮链接网页6,如何将提交按钮与使用javascript在html中创建的OPTION LIST链接...

我正在开发一个网页&#xff0c;其中有一个依赖下拉列表。其中第一个列表包含5个状态&#xff0c;第二个包含该州内的城市。我使用下面显示的脚本链接了两个下拉列表。我可以将提交按钮链接到第二个从属下拉列表中&#xff0c;当列表中选择了一个选项并单击提交按钮时&#xff…

第 5-4 课: Spring Boot 对测试的支持

在微服务架构下,整个系统被切割为 N 个独立的微服务相互配合来使用,那么对于系统可用性会有更高的要求。从大到小可以分为三个层级,开发人员编码需要做的单元测试、微服务和微服务之间的接口联调测试、微服务和微服务之间的集成测试,通过三层的严格测试才能有效保证系统的稳…