2015-12-24 63 views
8

當我通過使用額外的部分類將額外屬性添加到EF自動生成的類時,這些屬性在對數據庫運行查詢時未填充或填充。實體框架的額外屬性未由DbContext.Database.SqlQuery填充

例子:

自動生成的類人:

public partial class Person 
{ 
    public string Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

我自己的部分類

public partial class Person 
{ 
    public string DisplayName{ get; set; } 
} 

當我做下面的查詢:

"SELECT *, (FirstName + LastName) AS DisplayName FROM [Person]" 

和使用

DbContext.Database.SqlQuery(typePerson, SQL, null) 

Id,FirstName和LastName被填充,但不是DisplayName。

然而,當我創建一個名爲MyPerson

public partial class MyPerson 
{ 
    public string Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string DisplayName{ get; set; } 
} 

一個全新的類並運行的顯示名稱填充以及MyPerson的類型相同的查詢。

任何人都可以解釋這個或告訴我如何解決這個問題,所以我可以使用部分,而不必創建新的類/類型。

下載一個例子:https://www.dropbox.com/s/dayrv0jzuoju9q3/StackOverflow_EF_ExtraProperties.zip?dl=0

更新2015年12月28日: 在閱讀通過其他計算器和CodeProject上論壇,我找到了另外的方式來得到它的工作:

1)使用Typebuilder( http://www.codeproject.com/Articles/206416/Use-dynamic-type-in-Entity-Framework-SqlQuery),但由於各種項目依賴性,我發現已經創建的類型並沒有炸燬內存;

2)迄今爲止的最佳選擇:使用繼承。

當我創建只是這行其他類:

class Person_Reflect : Person { } 

我可以使用下面的代碼(它會忽略在EDMX文件和使用反射的映射:

List<EF.Person> listPerson = dbEntities.Database.SqlQuery<EF.Person_Reflect>(sql, new object[] { }).ToList<EF.Person>(); 
+3

你確定'Person'的第二部分類是在正確的命名空間中? –

+0

自從您更改模型後,沒有例外嗎? – dotctor

+0

你是否將DisplayName看作一個沒有價值的屬性? –

回答

0

嘗試刪除*

@" 
SELECT 
    Id 
    ,FirstName 
    ,LastName 
    ,(FirstName + ' ' + LastName) AS DisplayName 
FROM [Person]" 

或者你可以這樣做是代碼...然後你不會需要到目前爲止,把它列入你的原始SQL

public string DisplayName { get { return FirstName+ " " +LastName ; } } 
+0

退出*不起作用,甚至使情況變得更糟;如果我忘記了一列,則應用程序以異常結束: 數據讀取器與指定的'Application.Person'不兼容。該類型的成員「COLUMNNAME」在數據閱讀器中沒有相應的列,名稱相同。 你是絕對正確的,你的編碼解決方案解決了這個例子,但我有一個動態查詢,可以豐富運行時間,以創建大量的最終用戶選擇如何顯示/格式化結果。所以我只有一個視圖選項:使用evals或創建動態查詢。 –

+0

它應該工作...列必須是相同的CASE和數據類型。我已經做了一些模擬自己的事情,所以我知道它的工作..請仔細檢查案例和類型 – Seabizkit

+0

親愛的Seabizkit。我已經上傳了一個測試示例,其中我似乎無法完成您所完成的工作。完整示例的鏈接如下:https://www.dropbox.com/s/dayrv0jzuoju9q3/StackOverflow_EF_ExtraProperties.zip?dl=0 –

1

最好的選擇,而無需太多的代碼和或當發生數據庫更改爲使用繼承做多的代碼審查。

當我創建另一個類只有這一行:

class Person_Reflect : Person { } 

我可以使用下面的代碼(它會忽略在EDMX文件和使用反射貼圖):

List<EF.Person> listPerson = dbEntities.Database.SqlQuery<EF.Person_Reflect>(sql, new object[] { }).ToList<EF.Person>();