2010-12-06 47 views
2

我使用鑑別器字段實現了繼承,因此我所有的記錄都在同一個表中。我的basetype是Person(也是表的名稱),Driver和Passenger從它繼承。當我對Person執行對象上下文的查詢時,我收到正確類型(Driver和Passenger)的實例。例如:EF4繼承和存儲過程

var q = from d in ctx.Person 
     select d; 

但我還創建了一個函數,調用存儲過程並將函數的輸出映射到Person類型。但是現在,當我執行此方法時,我得到了一個人員列表,而不是司機或乘客。

任何人的想法如何解決這個問題或者這是EF4中的錯誤?

回答

1

AFAIK,在處理存儲過程映射時不能使用鑑別器映射(例如TPH)。

存儲過程必須映射到複雜類型或自定義實體(例如POCO),映射不能是有條件的。

你可以做的是將其映射到一個普通的POCO,然後項目那個結果集轉化爲相關的派生類型(手工判別)。

E.g:

public ICollection<Person> GetPeople() 
{ 
    var results = ExecuteFunction<Person>(); // result is ObjectResult<Person> 
    ICollection<Person> people = new List<Person>(); 

    foreach (var result in results) 
    { 
     if (result.FieldWhichIsYourDiscriminator == discriminatorForDriver) 
     { 
     people.Add((Driver)result); 
     } 

     // other discriminators 
    } 

} 

如果你總是期待一個類型(例如僅驅動程序)的集合,那麼你就不需要foreach循環,你只需要添加的範圍內。以上是如果您期待混合不同類型的人羣。

希望看到其他答案,如果還有更好的方法 - 但上面的工作。

+0

問題是我的鑑別器字段沒有公開在對象上,我想這樣保留它,因爲我們不想將該屬性暴露給使用我們庫的開發人員。所以恐怕我需要一個本地解決方案:-( – 2010-12-07 07:15:41