2016-06-23 65 views
0

我有一個使用數據庫優先的實體框架的新項目。這是因爲它查看了幾個不同客戶站點上已經存在的sql數據。我們有時發現的一個問題是數據庫我們的結尾和客戶的數據庫之間存在細微的差異。例如,我們可能有一個可爲空的字段,某些客戶將其設置爲非空,然後在其結尾處導致EF錯誤。我不知道乳清在他們附近有什麼不同之處。需要幫助循環和測試實體框架中的實體

我已經通過dbsets循環了以下代碼,但我似乎無法創建一個sql查詢,通過dbset類型運行查詢來測試它是否與數據庫相匹配,任何人都可以幫助嗎?

System.Data.Entity.Core.Objects.ObjectContext ctx = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)db).ObjectContext; 
     System.Data.Entity.Core.Metadata.Edm.MetadataWorkspace workspace = ctx.MetadataWorkspace; 
     IEnumerable<System.Data.Entity.Core.Metadata.Edm.EntityType> tables = workspace.GetItems<System.Data.Entity.Core.Metadata.Edm.EntityType>(System.Data.Entity.Core.Metadata.Edm.DataSpace.SSpace); 
     foreach (var table in tables) 
     { 
      var tableSchema = table.MetadataProperties["TableName"].Value.ToString(); 
      // Need something here to dynamically select all results 
      // If could pass the Entity Type to db.Database.SqlQuery<type> problem would be solved     
     } 

回答

0

你可以使用內置的實體框架

context.Database.CompatibleWithModel(true); 

的方法,或者你可以讀取數據庫的SYSTABLES。

此代碼可能與您的sql server不匹配!

SELECT TABLE_NAME, COLUMN_NAME, DOMAIN_NAME, NULLS, WIDTH FROM SYSTABLE LEFT JOIN SYSCOLUMN ON SYSTABLE.TABLE_ID = SYSCOLUMN.TABLE_ID LEFT JOIN SYSDOMAIN ON SYSCOLUMN.DOMAIN_ID = SYSDOMAIN.DOMAIN_ID WHERE SYSTABLE.TABLE_NAME = 'YourTableHere' 

這個查詢將返回所有列的表中,類型,如果列可以爲空。然後將此查詢結果與您的模型進行比較。您可以使用元數據,或者從GetProperties的類中讀取屬性。

public class DbColumnTypes { 
    public String TABLE_NAME { get; set; }; 
    public String COLUMN_NAME { get; set; }; 
    public String DOMAIN_NAME { get; set; }; 
    public Boolean ISNULLABLE { get; set; }; 
}  

List<DbColumnTypes> dbColumns; //Read that from your DB 
PropertyInfo[] properties = type.GetProperties(BindingFlags.Public).ToArray(); 
foreach(PropertyInfo item in properties) 
{ 
    if(dbColumns.Any(x => x.COLUMN_NAME == item.Name) { 
     //compare the Database types to the C# types (varchar with string, etc.) 
     if(item.Property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) 
     { 
      //check if database column is nullable 
     } 
    } 
} 

您可以將該代碼包裝在一個方法中,併爲您的ef模型中的每個類調用它。有了這個,你可以檢查你的數據庫是否符合你的模型。

要獲得所有類型的模型,你可以列舉命名空間中的所有類型:

var theList = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.Namespace == "your.name.space").ToList(); 

有了這個列表,你可以走線槽所有類和調用方法同上。

+0

我們正在談論數百個表格,我試圖避免自己手動檢查所有列。 – user1166905

+0

也因爲它的數據庫第一,而不是代碼第一,我不能使用CompatibleWithModel – user1166905

+0

因此,你可以比較查詢結果編程與您的項目中的類屬性。 – JoeJoe87577