這裡的“私闖sys.databases”是指Entity Framework預設發起的查詢:SELECT Count(*) FROM sys.databases WHERE [name]=N'資料庫名' 註:本文針對的是Entity Framework Code First場景,Entity Fra ...
這裡的“私闖sys.databases”是指Entity Framework預設發起的查詢:SELECT Count(*) FROM sys.databases WHERE [name]=N'資料庫名'
註:本文針對的是Entity Framework Code First場景,Entity Framework的版本是4.1與4.2。
3月份的時候在揭開Entity Framework LINQ查詢的一點面紗一文中發現了Entity Framework的兩個幕後交易。
第一個交易(私闖sys.databases):
SELECT Count ( * ) FROM sys.databases WHERE [ name ] = N ' CNBlogsData '第二個交易(私自打探資料庫的信息):
SELECT TOP ( 1 )[ Extent1 ] . [ Id ] AS [ Id ] ,
[ Extent1 ] . [ ModelHash ] AS [ ModelHash ]
FROM [ dbo ] . [ EdmMetadata ] AS [ Extent1 ]
ORDER BY [ Extent1 ] . [ Id ] DESC
當時通過modelBuilder.Conventions.Remove<IncludeMetadataConvention>();阻止了第二個交易,但未能找到方法阻止第一個交易。
記得當時用的是Entity Framework 4.0,後來微軟發佈了EF4.1和EF4.2。那我們來看看Entity Framework有沒有改邪歸正。
結果發現,只改了一半,第二個交易“浪子回頭”,而第一個交易“賊心不改”。
代碼世界是完美世界,決不允許這樣的行為,一定要將之繩之以法。
經過今天下午的努力,終於找到了這根“繩子”:
Database.SetInitializer<DbContextTypeName>(null);
示例代碼如下:
public class EfUnitOfWork : DbContext, IUnitOfWork
{
public EfUnitOfWork()
{
Database.SetInitializer<EfUnitOfWork>(null);
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
}
}
可以看出,Entity Framework“私闖sys.databases”的目的是為了在根據實體生成資料庫時,檢查是否存在同名的資料庫。
而我們的應用場景根本不需要Entity Framework生成資料庫,所以將之繩之以法是“名正言順”。
參考頁面:http://qingqingquege.cnblogs.com/p/5933752.html