首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Entity Framework 6 專家級特性深度解析:非同步、攔截、約定、連線重試與效能躍升

     編輯:關於.NET

EF6 透過 NuGet 獨立發布、開源開發,已超越早期「僅適合原型」的刻板印象,成為生產級 ORM 首選。本文依功能層次分類解析專家級特性。

免費贈送的核心增強

  • 視圖生成引擎重寫:大型模型 (數百實體) 啟動速度大幅提升,EF 6.0.1 修復 6.0.0 缺陷
  • LINQ Contains 編譯加速:查詢編譯階段效能優化,SQL 不變
  • SQL Server 資料庫預設 READ_COMMITTED_SNAPSHOT ON:減少封鎖、提高並發
  • 重用開啟的 DbConnection:消除「EntityConnection 需關閉連線」限制,利於連線池與交易共用

專家級功能清單

1. 完整非同步支援

// 查詢
await context.Customers.FirstOrDefaultAsync(c => c.Id == id);
await context.Customers.ToListAsync();

// 異動
await context.SaveChangesAsync();

// Find 非同步
var customer = await context.Customers.FindAsync(id);

對應 System.Data.Entity.QueryableExtensions 與 DbContext 擴充方法。

2. 自訂 Code First 約定

// 所有 string 欄位預設長度 50
modelBuilder.Properties<string>()
    .Configure(p => p.HasMaxLength(50));

// 強制自訂約定優先於內建約定
modelBuilder.Conventions.AddBefore<CustomConvention>(typeof(PrimaryKeyNameConvention));

3. 連線重試 / 執行策略

public class MyDbConfiguration : DbConfiguration {
    public MyDbConfiguration() {
        SetExecutionStrategy(SqlProviderServices.ProviderInvariantName,
            () => new SqlAzureExecutionStrategy());
    }
}
  • 內建 SqlAzureExecutionStrategy 針對 Azure SQL 暫時性錯誤自動重試 (預設 5 次、指數退避)
  • 可自訂 IDbExecutionStrategy 實作專屬重試邏輯
  • 執行緒安全:重試間隔隨機抖動避免驚群

4. 共用 DbTransaction / DbConnection

using (var tx = context.Database.BeginTransaction()) {
    try {
        context.SaveChanges();
        context.Database.ExecuteSqlCommand("UPDATE ...");
        tx.Commit();
    } catch { tx.Rollback(); }
}

預設獨立交易

圖 1 預設:SaveChanges 與 ExecuteSqlCommand 各自交易

共用交易

圖 2 BeginTransaction 共用單一交易

5. AddRange / RemoveRange 批次追蹤優化

context.Casinos.AddRange(new[] { casino1, casino2 }); // 單次 DetectChanges
  • 社群貢獻功能,大幅降低大量新增/刪除時的 DetectChanges 成本
  • 測試 50,000 實體新增至 Context 近乎瞬間完成
  • 注意:SaveChanges 仍逐筆送出 SQL,非批次執行

6. 忽略自訂 Equals/GetHashCode 於變更追蹤

EF6 內部使用 ObjectReferenceEqualityComparer,不再受領域模型覆寫 Equals 干擾,解決 DDD 值物件與變更追蹤衝突。

7. 巢狀型別支援 (DDD Value Object)

public class Casino {
    public Address PhysicalAddress { get; set; }
    public class Address : ValueObject<Address> { ... } // 巢狀類別
}

EF5 vs EF6 巢狀型別對比

圖 3 EF6 正確識別巢狀 Address 型別,EF5 則忽略

8. 查詢/命令攔截

public class MyInterceptor : IDbCommandInterceptor {
    public void ReaderExecuting(DbCommand cmd, ...) { 
        Log(cmd.CommandText); // 記錄或修改 SQL
    }
    // 其他介面方法...
}

註冊:DbInterception.Add(new MyInterceptor());

9. 自訂複數化服務

public class MyPluralization : IPluralizationService {
    public string Pluralize(string word) { ... }
    public string Singularize(string word) { ... }
}
// 註冊
DbConfiguration.SetPluralizationService(new MyPluralization());

Code First 遷移增強 (EF 6.1+)

  • 產生遷移腳本 Update-Database -Script 供 DBA 審核
  • __MigrationHistory 表結構可自訂適配非 SQL Server
  • 指定預設 Schema (非 dbo)
  • 單一資料庫多 DbContext 遷移協調
  • modelBuilder.Configurations.AddFromAssembly 批次載入設定類別

遷移提示:EF5→EF6 命名空間變更 (System.Data.Entity → System.Data.Entity.Core),官方提供 遷移指南。


作者:玄魂 (改編自 MSDN Magazine Data Points 專欄)
出處:https://www.cnblogs.com/xuanhun/

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved