天天看點

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)提供的資料庫提供程式之一,則隻需更新提供程式包。

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

Entity Framework Core 1.1 Preview 1 簡介

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

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

作者:smallprogram

出處:

http://www.cnblogs.com/smallprogram

感謝您的閱讀。喜歡的、有用的就請大哥大嫂們高擡貴手"推薦一下"吧!你的精神支援是部落客強大的寫作動力。歡迎轉載!另外,文章在表述和代碼方面如有不妥之處,歡迎批評指正。留下你的腳印,歡迎評論!