神马玩意,EntityFramework Core 1.1又更新了?走,赶紧去围观

简介: 前言 哦,不搞SQL了么,当然会继续,周末会继续更新,估计写完还得几十篇,但是我会坚持把SQL更新完毕,绝不会烂尾,后续很长一段时间没更新的话,不要想我,那说明我是学习新的技能去了,那就是学习英语,本来没有打算再探究目前.NET中跨平台的东西,毕竟才出来没多久,还是有很多坑,希望有人踩过再来学习会好很多,可惜项目中都是用的最新的东西,我不得不去探索,于是有关EntityFramework Core的坑就这么出来了,来,我们一起看看。

前言

哦,不搞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的内容。我们下节再会。

目录
相关文章
|
安全 Android开发
21天打卡Andoid学到的一些小知识-第十九二十二十一天
今天我们学习打卡的内容是:android 10.0 去掉未知来源弹窗 默认授予安装未知来源权限
89 0
|
设计模式 算法 Java
【社区投稿】一看就懂!超全解析 OpenMMLab 的 Hook 机制
OpenMMLab 系列的一大特色是其所采用的 Hook 机制。同样作为计算机视觉算法框架, 相比于简单易懂、对新手友好的 Gluon-CV, Hook 机制无疑提高了初学者入门 OpenMMLab 系列工具箱的难度。一个很自然的问题就是,为什么要引入 Hook 机制?
570 0
【社区投稿】一看就懂!超全解析 OpenMMLab 的 Hook 机制
|
前端开发 IDE Java
干掉 Swagger (丝袜哥),试试这个新工具!
干掉 Swagger (丝袜哥),试试这个新工具!
158 0
干掉 Swagger (丝袜哥),试试这个新工具!
|
存储 缓存 前端开发
为什么我要推荐你使用Core WebApi?
为什么我要推荐你使用Core WebApi?
275 0
为什么我要推荐你使用Core WebApi?
|
监控 NoSQL Unix
开源代码分析技巧之三——老外如是说
继续从深入分析开源代码说起,当然源码分析没有太多捷径可走。笔者只是探讨下,如何分析会更好些。特通过Samba技术邮件群组,向老外提问“如何更好的分析Samba源码”。
284 0
2017-5-29学习记录——WebApi(1)
曾经我一直认为Web服务器的Api使用ashx或ASP.NET MVC中返回JsonResult来实现的。 当我第一次接触WCF的时候,有同学告诉我目前比较流行WebApi和WebSocket了,于是我还担心着我怎么总在学不咋用了的技术哟。
1052 1
|
JSON 开发框架 .NET
net core 小坑杂记之配置文件读取(不定期更新)
    其实很早就想写了,原想等积累差不多了再写的,但是发现遇到一个当时记下效果会比较好,所以就不定期更新这个系列了,后面获取会整个整理一下。     此篇记载net core入门时踩的一些坑,网上教程太少了,也不规范,一些小细节都没人提,对于自学的小白来说,真是能把自己坑到放弃~  but,坚持住!你会发现解决问题以后会更有意思。
1264 0
|
前端开发 C#
抛弃NVelocity,来玩玩Razor
原文:抛弃NVelocity,来玩玩Razor      对于内容型,不易变动的东西我们都希望给它来个静态化,还有种情况就是比如新浪云不支持.net,为了能跑起我们的网站, 只能放些静态页面上面,外加jsonp来实现交互,我们知道.net中有很多模板引擎,但都不是原装的,所以基本都没有代码提示, 用起来比较不爽,自razor出来后,私活中也抛弃了原先使用的NVelocity,而采用原装的razor。
1135 0