2012-05-25 87 views
3

時,我有一個類,它看起來像這樣:爲什麼不我與數據註釋地圖列使用實體框架

public class Analyst 
{ 
    [Column("Internal_ID")] 
    public int ID { get; set; } // if this is named like the column, it works 
    [Column("DisplayName")] 
    public string Name { get; set; } 
} 

該對象被填滿像這樣(這接下來的部分是在繼承的類從的DbContext):

public List<T> ExecProc<T>(string proc, Dictionary<string, object> params) 
{ 
     var parms = new List<SqlParameter>(); 
     var sql = new StringBuilder(); 
     sql.Append(sproc.StoredProcedure); 
     sql.Append(" "); // a space, that's all it is 
     foreach (var key in sproc.Parameters.Keys) 
     { 
      sql.Append(string.Format("{0},", key)); 
      parms.Add(new SqlParameter(key, sproc.Parameters[key])); 
     } 
     if (sql[sql.Length - 1] == ',') // removing the trailing , 
     { 
      sql.Remove(sql.Length - 1, 1); 
     } 
     return Database.SqlQuery<T>(sql.ToString(), parms.ToArray()).ToList(); 
} 

返回的列表中包含的行(或對象的在這種情況下正確的量),但沒有屬性的已填充了的值。如果proc返回200行,那麼我會在列表中獲得200個對象,但沒有任何值填充任何值。

我已驗證字段名稱和[Column(「name」)]屬性中的值之間沒有不匹配。如果我更改屬性名稱以匹配結果集中的字段名稱,那麼它工作正常,但如果我嘗試使用數據註釋映射它們,我似乎無法使其工作。任何人都可以請指出我在這裏錯過了什麼?我確信這很簡單。使用:Visual Studio 2010 Ultimate SP1,.Net 4 SP1,EF 4.2.0(我遇到了與EF 4.3相同的問題)。這全部都是使用代碼完成的,因此沒有使用映射文件。

回答

8

看起來,這是記錄的行爲。 Database.SqlQuery Method與DbContext模型配置沒有直接連接。

創建一個原始SQL查詢,該查詢將返回給定類型 類型的元素。 該類型可以是任何類型,其屬性與查詢返回的列的名稱相匹配,或可以是簡單的 基本類型的 。

所以,當使用這種方法時,您應該構造您的sql,以便結果集列名匹配used類型的屬性名稱。

+1

三年後,這個答案幫了我。我有一個我無法更改的數據模型,但列名不符合我們的命名約定。 在我用於反序列化查詢的POCO中,我爲數據庫中的每個列創建了一個專用字段,並且使用正確命名的屬性創建了一個公共字段,只公開了一個getter方法以返回私有字段中的值。 這可能會在三年後幫助別人。 – Ben

+0

它幫助我在接下來的14個月後:) –

相關問題