實體框架核心(EF Core)是Entity Framework的一個輕量級,可擴展和跨平臺版本。 10月25日,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
若是你使用的工具包,那麼必定要升級。 請注意,工具版本化爲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" },
1.1版本專一於解決阻止人們採用EF Core的問題。 這包括修復錯誤並添加一些還沒有在EF Core中實現的關鍵功能。 雖然EF開發組在這方面取得了一些良好的進展,可是,EF Core仍然不會是每一個人的正確選擇。 有關實現的更多詳細信息,請參閱下面的EF Core和EF6.x比較。框架
有兩個版本的Entity Framework,Entity Framework Core和Entity Framework 6.x.ide
Entity Framework 6.x(EF6.x)是一種通過試驗和測試的數據訪問技術,具備多年的功能和穩定性。 它首次在2008年發佈,做爲.NET Framework 3.5 SP1和Visual Studio 2008 SP1的一部分。 從EF4.1版本開始,它做爲EntityFramework NuGet包發運 - 目前是NuGet.org上最受歡迎的包。工具
EF6.x繼續是一個受支持的產品,並將繼續進行錯誤修復和小的改進。測試
實體框架核心(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
在1.1版本中,EF研發團隊在改進EF Core LINQ提供程序方面取得了良好的進展。 這使得更多的查詢可以成功執行,在數據庫(而不是內存)中評估更多的邏輯。
DbSet.Find(...)是一個存在於EF6.x中的API,而且是EF Core的更常見的請求之一。 它容許您根據主鍵值輕鬆查詢實體。 若是實體已經加載到上下文中,則返回它而不查詢數據庫。
using (var db = new BloggingContext()) { var blog = db.Blogs.Find(1); }
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();
陰影屬性是實體類中不存在的屬性。 這些屬性的值和狀態徹底保留在更改跟蹤器中
能夠經過ChangeTracker API獲取和更改陰影屬性值。
context.Entry(myBlog).Property("LastUpdated").CurrentValue = DateTime.Now;
陰影屬性能夠經過EF.Property靜態方法在LINQ查詢中引用。
var blogs = context.Blogs .OrderBy(b => EF.Property<DateTime>(b, "LastUpdated"));
按照慣例,僅當發現關係時才建立陰影屬性,但在從屬實體類中找不到外鍵屬性。 在這種狀況下,將引入影子外鍵屬性。 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配置陰影屬性。 一旦你調用了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(); }
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的一項功能。 您如今能夠指定實體映射到的表是內存優化的。 當使用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>(); } }
穩定的1.1版本將於今年晚些時候推出。 EF研發團隊不計劃在preview1和穩定版本之間添加任何新功能。 將只是努力修復報告的錯誤。
EF研發團隊如今將注意力轉移到EF Core 1.2和EF6.2版本。 將在不久的未來分享這些版本的詳細信息。
貼一張Rowan Miller的帥照。Microsoft員工,EF研發團隊成員,他的我的Blog:https://romiller.com/,有興趣的朋友能夠去看看。
最後,但願本文對你有所幫助。
轉載請註明出處,轉載請註明出處,轉載請註明出處,重要的事情說三遍:http://www.cnblogs.com/smallprogram/