神馬玩意,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的內容。我們下節再會。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM