程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Entity Framework Core 1.1 Preview 1 簡介,entitypreview

Entity Framework Core 1.1 Preview 1 簡介,entitypreview

編輯:關於.NET

Entity Framework Core 1.1 Preview 1 簡介,entitypreview


實體框架核心(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)提供的數據庫提供程序之一,則只需升級提供程序包。

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上的工具都是如此)。

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.

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中實現。

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

改進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/,有興趣的朋友可以去看看。

最後,希望本文對你有所幫助。

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved