前言

哦,不搞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又更新了?走,赶紧去围观的更多相关文章

  1. EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)

    前言 终于踏出第一步探索EF Core原理和本质,过程虽然比较漫长且枯燥乏味还得反复论证,其中滋味自知,EF Core的强大想必不用我再过多废话,有时候我们是否思考过背后到底做了些什么,到底怎么实现的 ...

  2. 你必须知道的EntityFramework 6.x和EntityFramework Core变更追踪状态

    前言 只要有时间就会时不时去看最新EF Core的进展情况,同时也会去看下基础,把握好基础至关重要,本节我们对比看看如标题EF 6.x和EF Core的不同,希望对正在学习EF Core的同行能有所帮 ...

  3. 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平台下, ...

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

  5. EntityFramework Core一劳永逸动态加载模型,我们要知道些什么呢?

    前言 这篇文章源于一位问我的童鞋:在EntityFramework Core中如何动态加载模型呢?在学习EntityFramwork时关于这个问题已有对应园友给出答案,故没有过多研究,虽然最后解决了这 ...

  6. EntityFramework Core Raw SQL

    前言 本节我们来讲讲EF Core中的原始查询,目前在项目中对于简单的查询直接通过EF就可以解决,但是涉及到多表查询时为了一步到位就采用了原始查询的方式进行.下面我们一起来看看. EntityFram ...

  7. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  8. Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  9. EntityFramework 7 更名为EntityFramework Core(预发布状态)

    前言 最近很少去学习和探索新的东西,尤其是之前一直比较关注的EF领域,本身不太懒,但是苦于环境比较影响自身的心情,所以迟迟没有下笔,但是不去学习感觉在精神层面缺少点什么,同时也有园友说EF又更新了,要 ...

随机推荐

  1. 关于.NET异常处理的思考

    年关将至,对于大部分程序员来说,马上就可以闲下来一段时间了,然而在这个闲暇的时间里,唯有争论哪门语言更好可以消磨时光,估计最近会有很多关于java与.net的博文出现,我表示要作为一个吃瓜群众,静静的 ...

  2. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库

    在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...

  3. iframe用法

    <iframe src="http://caiyanli.top/" height="500"  width="500" frameb ...

  4. 冒泡,setinterval,背景图的div绑定事件,匿名函数问题

    1.会冒泡到兄弟元素么? $(function(){ $("#a").click(function(){alert("a")}) $("#b" ...

  5. [C#] C# 知识回顾 - 委托 delegate

    C# 知识回顾 - 委托 delegate [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6031892.html 目录 What's 委托 委托的属性 ...

  6. 微信小程序开发日记——高仿知乎日报(中)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...

  7. 嵌入式&iOS:回调函数(C)与block(OC)回调对比

    学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...

  8. Android之解析XML

    1.XML:可扩展标记语言. 可扩展标记语言是一种很像超文本标记语言的标记语言. 它的设计宗旨是传输数据,而不是显示数据. 它的标记没有被预定义.需要自行定义标签. 它被设计为具有自我描述性. 是W3 ...

  9. Python学习基础

    1.使用范围: 大数据 .图像处理.web .运维.爬虫.自动化.科学计算 2.准备环境: linux/mac python 3.5.2 ipython vim/sublime/atom 3.列表 3 ...

  10. 史上最全Windows版本搭建安装React Native环境配置

    史上最全Windows版本搭建安装React Native环境配置 配置过React Native 环境的都知道,在Windows React Native环境配置有很多坑要跳,为了帮助新手快速无误的 ...