Entity Framework Core 1.1 Preview 1 簡介

實體框架核心(EF Core)是Entity Framework的一個輕量級,可擴展和跨平臺版本。 10月25日,Entity Framework Core 1.1 Preview 1發佈了。數據庫

升級到Entity Framework Core 1.1 Preview 1

若是您使用由EF團隊(SQL Server,SQLite和InMemory)提供的數據庫提供程序之一,則只需升級提供程序包。json

PM> Update-Package Microsoft.EntityFrameworkCore.SqlServer –Pre
若是您使用的是第三方數據庫提供程序,請檢查它們是否已發佈依賴於1.1.0-preview1-final的更新。 若是他們有,那麼只是升級到新版本。 若是沒有,那麼你應該只能升級它們依賴的EF Core關係組件。 1.1中的大部分新功能不須要更改數據庫提供程序。 EF開發組作了一些測試,以確保依賴於1.0的數據庫提供程序繼續使用1.1預覽1,但這個測試還不詳盡。
 
PM> Update-Package Microsoft.EntityFrameworkCore.Relational –Pre

升級tooling packages

若是你使用的工具包,那麼必定要升級。 請注意,工具版本化爲1.0.0-preview3-final,由於工具還沒有達到其初始穩定版本(在.NET Core,ASP.NET Core和EF Core上的工具都是如此)。app

PM> Update-Package Microsoft.EntityFrameworkCore.Tools –Pre
若是您使用的是ASP.NET Core,那麼您須要更新project.json的tools部分以使用新的Microsoft.EntityFrameworkCore.Tools.DotNet包。 隨着.NET CLI工具的設計的進行,咱們必須將dotnet ef工具分離到這個單獨的包中。
"tools": {
  "Microsoft.EntityFrameworkCore.Tools.DotNet": "1.0.0-preview3-final"
},

什麼是Entity Framework Core 1.1 Preview 1

1.1版本專一於解決阻止人們採用EF Core的問題。 這包括修復錯誤並添加一些還沒有在EF Core中實現的關鍵功能。 雖然EF開發組在這方面取得了一些良好的進展,可是,EF Core仍然不會是每一個人的正確選擇。 有關實現的更多詳細信息,請參閱下面的EF Core和EF6.x比較。框架

EF Core和EF6.x比較

有兩個版本的Entity Framework,Entity Framework Core和Entity Framework 6.x.ide

Entity Framework 6.x

Entity Framework 6.x(EF6.x)是一種通過試驗和測試的數據訪問技術,具備多年的功能和穩定性。 它首次在2008年發佈,做爲.NET Framework 3.5 SP1和Visual Studio 2008 SP1的一部分。 從EF4.1版本開始,它做爲EntityFramework NuGet包發運 - 目前是NuGet.org上最受歡迎的包。工具

EF6.x繼續是一個受支持的產品,並將繼續進行錯誤修復和小的改進。測試

Entity Framework Core

實體框架核心(EF Core)是Entity Framework的一個輕量級,可擴展和跨平臺版本。 與EF6.x相比,EF Core引入了許多改進和新功能。 同時,EF Core 是一個新的代碼基礎優化

EF Core保留了來自EF6.x的開發者體驗,大多數頂級API也保持不變,所以EF Core對使用EF6.x的用戶會感到很是熟悉。 同時,EF Core構建了一套全新的核心組件。 這意味着EF Core不會自動繼承EF6.x的全部功能。 其中一些功能將在將來版本中顯示(例如延遲加載和鏈接彈性),其餘較不經常使用的功能將不會在EF Core中實現。ui

新的,可擴展的和輕量級核心還容許咱們在EF核心中添加一些在EF6.x中不能實現的特性(例如在LINQ查詢中的備用密鑰和混合客戶端/數據庫評估)。spa

改進LINQ翻譯

在1.1版本中,EF研發團隊在改進EF Core LINQ提供程序方面取得了良好的進展。 這使得更多的查詢可以成功執行,在數據庫(而不是內存)中評估更多的邏輯。

DbSet.Find

DbSet.Find(...)是一個存在於EF6.x中的API,而且是EF Core的更常見的請求之一。 它容許您根據主鍵值輕鬆查詢實體。 若是實體已經加載到上下文中,則返回它而不查詢數據庫。

using (var db = new BloggingContext())
{
    var blog = db.Blogs.Find(1);
}

映射到字段(Mapping to fields)

API中的新的HasField(...)方法容許您爲屬性配置備用字段。 這是最多見的作法是當一個屬性沒有setter。

public class BloggingContext : DbContext
{
    ...

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property(b => b.Url)
            .HasField("_theUrl");
    }
}
默認狀況下,EF將在查詢期間構造實體的實例時使用該字段,或者當它沒法使用該屬性時(即,它須要設置值,但沒有屬性設置器)。 您能夠經過新的UsePropertyAccessMode(...)API更改。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Url)
        .HasField("_theUrl")
        .UsePropertyAccessMode(PropertyAccessMode.Field);
}

您還能夠在模型中建立在實體類中沒有相應屬性的屬性,但使用字段將數據存儲在實體中。 這與「陰影屬性」(下面介紹,距離此處12cm)不一樣,數據存儲在更改跟蹤器中。 若是實體類使用方法來獲取/設置值,則一般使用此方法。

您能夠在屬性(...)API中給EF字段的名稱。 若是沒有具備給定名稱的屬性,則EF將尋找一個字段。

public class BloggingContext : DbContext
{
    ...

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property("_theUrl");
    }
}
您還能夠選擇爲該屬性指定名稱,而不是字段名稱。 而後在建立模型時使用此名稱,最明顯的是它將用於映射到數據庫中的列名稱。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property<string>("Url")
        .HasField("_theUrl");
}
您可使用EF.Property(...)方法在LINQ查詢中引用這些屬性。
var blogs = db.Blogs
    .OrderBy(b => EF.Property<string>(b, "Url"))
    .ToList();
 

陰影屬性(Entity Framework Core)

陰影屬性是實體類中不存在的屬性。 這些屬性的值和狀態徹底保留在更改跟蹤器中

能夠經過ChangeTracker API獲取和更改陰影屬性值。

context.Entry(myBlog).Property("LastUpdated").CurrentValue = DateTime.Now;
陰影屬性能夠經過EF.Property靜態方法在LINQ查詢中引用。
var blogs = context.Blogs .OrderBy(b => EF.Property<DateTime>(b, "LastUpdated"));

陰影屬性約定(Conventions Shadow Properties)

按照慣例,僅當發現關係時才建立陰影屬性,但在從屬實體類中找不到外鍵屬性。 在這種狀況下,將引入影子外鍵屬性。 shadow外鍵屬性將命名爲<navigation property name><principal key property name>(在依賴實體上的導航,它指向主體實體,用於命名)。 若是主鍵屬性名稱包含導航屬性的名稱,則名稱將只是<principal key property name>。 若是從屬實體上沒有導航屬性,則在其位置使用主類型名稱。

例如,如下代碼清單將致使向Post實體引入BlogId shadow屬性。

class MyContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } public List<Post> Posts { get; set; } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public Blog Blog { get; set; } }

陰影屬性數據註釋

沒法使用數據註釋建立陰影屬性。

陰影屬性Fluent API

您可使用Fluent API配置陰影屬性。 一旦你調用了Property的字符串重載,你就能夠連接任何對其餘屬性的配置調用。

若是提供給Property方法的名稱與現有屬性(陰影屬性或實體類上定義的屬性)的名稱匹配,則代碼將配置現有屬性,而不是引入新的shadow屬性。

class MyContext : DbContext { public DbSet<Blog> Blogs { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .Property<DateTime>("LastUpdated"); } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } }

陰影屬性介紹完畢!

 

顯式加載

顯式加載容許您加載由上下文跟蹤的實體的導航屬性的內容。

using (var db = new BloggingContext())
{
    var blog = db.Blogs.Find(1);

    db.Entry(blog).Collection(b => b.Posts).Load();
    db.Entry(blog).Reference(b => b.Author).Load();
}

來自EF6.x的其餘EntityEntry API

EF研發團隊添加了EF6.x中提供的其他EntityEntry API。 這包括Reload(),GetModifiedProperties(),GetDatabaseValues()等。這些API最經常使用的是經過調用DbContext.Entry(對象實體)方法。

鏈接彈性

鏈接彈性自動重試失敗的數據庫命令。 此版本包括專爲SQL Server(包括SQL Azure)定製的執行策略。 此執行策略包含在咱們的SQL Server提供程序中。 它知道能夠重試的異常類型,而且具備明顯的默認值,用於最大重試次數,重試之間的延遲等。

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseSqlServer(
        "<connection string>",
        options => options.EnableRetryOnFailure());
}

其餘數據庫提供者能夠選擇添加爲其數據庫定製的重試策略。 還有一種機制來註冊本身的自定義執行策略。

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseMyProvider(
        "<connection string>",
        options => options.ExecutionStrategy(...));
}

 

SQL Server內存優化表支持

內存優化表是SQL Server的一項功能。 您如今能夠指定實體映射到的表是內存優化的。 當使用EF Core基於您的模型(使用遷移或Database.EnsureCreated)建立和維護數據庫時,將爲這些實體建立一個內存優化表。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .ForSqlServerIsMemoryOptimized();
 }
 

簡化服務更換

在EF Core 1.0中,能夠替換EF使用的內部服務,但這是複雜的,須要您控制EF使用的依賴注入容器。 在1.1中,咱們使用了一個ReplaceService(...)方法,能夠在配置上下文時使用它。

public class BloggingContext : DbContext
{
    ...

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        ...

        optionsBuilder.ReplaceService<SqlServerTypeMapper, MyCustomSqlServerTypeMapper>();
    }
}

Entity Framework Core 1.1 Preview 1的將來版本

穩定的1.1版本將於今年晚些時候推出。 EF研發團隊不計劃在preview1和穩定版本之間添加任何新功能。 將只是努力修復報告的錯誤。

EF研發團隊如今將注意力轉移到EF Core 1.2和EF6.2版本。 將在不久的未來分享這些版本的詳細信息。

 

貼一張Rowan Miller的帥照。Microsoft員工,EF研發團隊成員,他的我的Blog:https://romiller.com/,有興趣的朋友能夠去看看。

9k=

最後,但願本文對你有所幫助。

轉載請註明出處,轉載請註明出處,轉載請註明出處,重要的事情說三遍:http://www.cnblogs.com/smallprogram/

相關文章
相關標籤/搜索