神马玩意,EntityFramework Core 1.1又更新了?走,赶紧去围观
前言
哦,不搞SQL了么,当然会继续,周末会继续更新,估计写完还得几十篇,但是我会坚持把SQL更新完毕,绝不会烂尾,后续很长一段时间没更新的话,不要想我,那说明我是学习新的技能去了,那就是学习英语,本来没有打算再探究目前.NET中跨平台的东西,毕竟才出来没多久,还是有很多坑,希望有人踩过再来学习会好很多,可惜项目中都是用的最新的东西,我不得不去探索,于是有关EntityFramework Core的坑就这么出来了,来,我们一起看看。
EntityFramework Core 1.1迁移
我们首先还是给出本文需要说到的两个类,博客类(Blog)和文章发表类(Post)。基于每个类都有主键Id,我们定义一个接口。如下:
public interface IEntityBase
{
int Id { get; set; }
}
public class Blog : IEntityBase
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual string Url { get; set; } public virtual ICollection<Post> Posts { get; set; }
}
public class Post : IEntityBase
{
public virtual int Id { get; set; }
public virtual string Title { get; set; }
public virtual string Content { get; set; } public virtual int BlogId { get; set; }
public virtual Blog Blog { get; set; }
}
在EF 6.x中我们可以直接通过继承EntityTypeConfigiration<T>来进行映射,但是在EF Core中则没有,但是还是在GitHub上找到了解决方案,EF团队给出的答案是后续有可能会实现,当前对于这个映射优先级比较低暂时还未实现。链接【https://github.com/aspnet/EntityFramework/issues/2805#issue-99973931】接着我们映射如下:
public class BlogMap : EntityMappingConfiguration<Blog>
{
public override void Map(EntityTypeBuilder<Blog> b)
{
b.ToTable("Blog");
b.HasKey(k => k.Id);
b.Property(p => p.Name);
b.Property(p => p.Url);
b.HasMany(p => p.Posts).WithOne(p => p.Blog).HasForeignKey(p => p.BlogId);
}
} public class PostMap : EntityMappingConfiguration<Post>
{
public override void Map(EntityTypeBuilder<Post> b)
{
b.ToTable("Post");
b.HasKey(k => k.Id);
b.Property(p => p.Title);
b.Property(p => p.Content);
}
}
EF上下文定义如下:
public class EFCoreContext : DbContext
{
public EFCoreContext(DbContextOptions options) : base(options) { }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.AddEntityConfigurationsFromAssembly(GetType().GetTypeInfo().Assembly);
}
}
接着在服务中注入EF上下文
services.AddDbContext<EFCoreContext>(options =>
{
options.UseSqlServer(sqlStr);
});
搭建了一个基本项目,我们将EF这一层放在StudyEFCore.Data下,实体放在StudyEFCore.Model下。如下:

来接下来我们进行迁移看看。我们通过如下命令行来进行:
dotnet ef migrations add Initial
结果是这样的

居然找不到dotnet-ef这个命令,园中已有答案,迁移需要利用添加EF工具包来进行
Microsoft.EntityFrameworkCore.Tools
按照这个链接【http://www.cnblogs.com/nele/p/5831434.html】来进行安装EF工具包。大概是如下这样
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0"
},
"Pomelo.EntityFrameworkCore.MySql": "1.0.0",
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
},
"tools": {
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
},
结果然后当然是可行的,但是Microsoft.EntityFrameworkCore.Tools最新的包是1.0.0-preview4-final,我们将其更新再运行试试。

结果令我们大吃一惊,更新到最近版本居然和没添加一样,这是什么情况尼,原来在tools节点下从EF Core 1.1开始现在已经由如下包代替
Microsoft.EntityFrameworkCore.Tools.DotNet
也就说在tools节点下我们需要添加上述包而非之前的Microsoft.EntityFrameworkCore.Tools包
"tools": {
"Microsoft.EntityFrameworkCore.Tools.DotNet": "1.1.0-preview4"
},
那么为什么要进行代替尼,EF团队的解释如下:
As the design of .NET CLI Tools has progressed it has become necessary for us to separate the dotnet ef tools into this separate package.
大意是随着.NET CLI工具设计的完善,现在有必要将donet ef工具单独放在一个包中。接下来我们将上述继续进行修改,将tools节点下替换,而依赖中包修改为最新的包即可【额外说一句上述依赖包中的Microsoft.EntityFremeworkCore.Tools我们也可以用Microsoft.EntityFrameworkCore.Design代替】。结果如下:

神马玩意,又出错了,看到错误说明我们才明白过来,当我们在应用程序目录下创建EF时,这个时候肯定是没问题的,如果我们将EF单独作为一个项目来使用,我们在应用程序只是将其作为引用此时它会找不到EF上下文,毕竟迁移它会去查找EF上下文并迁移。此时我们只需要在Startup.cs中在注入EF时明确告诉要执行的命令要将EF迁移文件生成到当前应用程序的程序集下即可,如下:
services.AddDbContext<EFCoreContext>(options =>
{
options.UseSqlServer(sqlStr, d => d.MigrationsAssembly("StudyEFCore"));
});
接下来我们再来看看情况是怎样的,如下:

接下来我们再来将模型更新到数据库并生成表。通过如下命令
dotnet ef database update

总结
好了到了这里关于EF Core 1.1迁移就告一段落,希望能给看到本文的你不会感觉到上手EF Core会很难,后续有时间会陆续更新EF Core的内容。我们下节再会。
神马玩意,EntityFramework Core 1.1又更新了?走,赶紧去围观的更多相关文章
- EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)
前言 终于踏出第一步探索EF Core原理和本质,过程虽然比较漫长且枯燥乏味还得反复论证,其中滋味自知,EF Core的强大想必不用我再过多废话,有时候我们是否思考过背后到底做了些什么,到底怎么实现的 ...
- 你必须知道的EntityFramework 6.x和EntityFramework Core变更追踪状态
前言 只要有时间就会时不时去看最新EF Core的进展情况,同时也会去看下基础,把握好基础至关重要,本节我们对比看看如标题EF 6.x和EF Core的不同,希望对正在学习EF Core的同行能有所帮 ...
- Webservice WCF WebApi 前端数据可视化 前端数据可视化 C# asp.net PhoneGap html5 C# Where 网站分布式开发简介 EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下? SQL Server之深入理解STUFF 你必须知道的EntityFramework 6.x和EntityFramework Cor
Webservice WCF WebApi 注明:改编加组合 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下, ...
- Cookies 初识 Dotnetspider EF 6.x、EF Core实现dynamic动态查询和EF Core注入多个上下文实例池你知道有什么问题? EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)
Cookies 1.创建HttpCookies Cookie=new HttpCookies("CookieName");2.添加内容Cookie.Values.Add(&qu ...
- EntityFramework Core一劳永逸动态加载模型,我们要知道些什么呢?
前言 这篇文章源于一位问我的童鞋:在EntityFramework Core中如何动态加载模型呢?在学习EntityFramwork时关于这个问题已有对应园友给出答案,故没有过多研究,虽然最后解决了这 ...
- EntityFramework Core Raw SQL
前言 本节我们来讲讲EF Core中的原始查询,目前在项目中对于简单的查询直接通过EF就可以解决,但是涉及到多表查询时为了一步到位就采用了原始查询的方式进行.下面我们一起来看看. EntityFram ...
- EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...
- Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
- EntityFramework 7 更名为EntityFramework Core(预发布状态)
前言 最近很少去学习和探索新的东西,尤其是之前一直比较关注的EF领域,本身不太懒,但是苦于环境比较影响自身的心情,所以迟迟没有下笔,但是不去学习感觉在精神层面缺少点什么,同时也有园友说EF又更新了,要 ...
随机推荐
- HTML BOM Browser对象
BOM:Browser Object Model,即浏览器对象模型,提供了独立于内容的.可以与浏览器窗口进行互动的对象结构. Browser对象:指BOM提供的多个对象,包括:Window.Navig ...
- Node.js:Buffer浅谈
Javascript在客户端对于unicode编码的数据操作支持非常友好,但是对二进制数据的处理就不尽人意.Node.js为了能够处理二进制数据或非unicode编码的数据,便设计了Buffer类,该 ...
- 当web.config文件放置在共享目录下(UNC),启动IIS会提示有错误信息500.19,伴随有错误代码0x80070003和错误代码0x80070005的解决办法
最近遇到一个很有意思的使用环境,操作人员将所有的网站应用内容投放到共享存储里面,并且使用微软的SMB协议将其以CIFS的方式共享出来,使用Windows Server 2008 R2的IIS将其连接起 ...
- 用神奇的currentColor制作简洁的颜色动画效果
先上一个兼容性总结图:老版本ie可以直接用复杂方法了,套用某表情包的话: 2016年了,做前端你还考虑兼容IE6?你这简直是自暴自弃! 好了,知道了兼容性,我们可以放心的使用了. 在CSS3中扩展了 ...
- Java消息队列--JMS概述
1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...
- 脑洞大开之采用HTML5+SignalR2.0(.Net)实现原生Web视频
目录 对SignalR不了解的人可以直接移步下面的目录 SignalR系列目录 前言 - -,我又来了,今天废话不多说,我们直接来实现Web视频聊天. 采用的技术如下: HTML5 WebRTC Si ...
- 数塔问题(DP算法)自底向上计算最大值
Input 输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数 ...
- Android开发学习—— Fragment
#Fragment* 用途:在一个Activity里切换界面,切换界面时只切换Fragment里面的内容* 生命周期方法跟Activity一致,可以理解把其为就是一个Activity* 定义布局文件作 ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- ASP.NET Aries 3.0发布(附带通用API设计及基本教程介绍)
主要更新: 1:升级处理机制(js请求由同步变更为异步) 2:优化前端JS:包括API和配置方式. 3:增加InputDialog功能. 4:增远远程验证功能. 5:优化权限安全机制. 6:增加一次请 ...