none
使用ObjectContext.ExecuteStoreQuery<T> 無法正確顯示POCO T 物件自訂的屬性 RRS feed

  • 問題

  • 各位好,小弟在使用Entity Framework 4.0 的ObjectContext.ExecuteStoreQuery<T>遇到了一些問題,特來請教。
    我程式的功能是希望能使用SQL透過ExecuteStoreQuery產生對應的POCO資料集。但目前查詢出來的POCO 物件其中的自訂欄位卻無法正確的顯示值。

    環境描述:
      - 在資料庫中有[COMPANY]跟[DEPT]兩資料表。
      - 使用EF 4.0,並且使用POCO templete generator產生POCO的class。並且在poco class DEPT新增一個欄位COM_NAME。
     

    執行結果: 
      sql中撈取DEPT並且LEFT JOIN COMPANY取得COM_NAME。之後使用ObjectContext.ExecuteStoreQuery<DEPT>正確取得資料集。但COM_NAME欄位未正確設定值。我有測試另外建一個跟DEPT欄位一樣的Class DEPT_INFO,卻可以正確的設定值。

      觀察ObjectContext的原始檔後,發現如下的程式,似乎是因為會把POCO物件自動對應到edm type,但因為edm type上沒有自訂的欄位COM_NAME,所以造成此欄位未被設值。
     
        if (MetadataHelper.TryDetermineCSpaceModelType<TElement>(this.MetadataWorkspace, out modelEdmType))
          {
            if (entitySet != null && !entitySet.ElementType.IsAssignableFrom(modelEdmType))
              throw EntityUtil.InvalidOperation(System.Data.Entity.Strings.ObjectContext_InvalidEntitySetForStoreQuery((object) entitySet.EntityContainer.Name, (object) entitySet.Name, (object) typeof (TElement)));
            collectionColumnMap = ColumnMapFactory.CreateColumnMapFromReaderAndType(reader, modelEdmType, entitySet, (Dictionary<string, FunctionImportReturnTypeStructuralTypeColumnRenameMapping>) null);
          }
          else
            collectionColumnMap = ColumnMapFactory.CreateColumnMapFromReaderAndClrType(reader, typeof (TElement), this.MetadataWorkspace);
           
      想請問是否有建議的作法或能提供修改方向,謝謝。
     
      ps. 需使用ExecuteStoreQuery的方式,不使用linq   
      

    2012年2月4日 上午 06:24

解答

  • 我沒找出解法,所以目前是更改架構來避開問題。 原本使用partial class來新增欄位,改為使用子類別繼承,子類別與edm間就沒有關聯,可以正確查詢出資料。

    但缺點是 1. Class數變多了。 2. 要存檔時,必須把子類別再轉換回原本的POCO 類別。

    • 已標示為解答 tchsuaskl 2012年2月15日 上午 05:14
    2012年2月13日 上午 06:01

所有回覆

  • 你要不要補充說明一下?或是已自行解決?

    blog.kkbruce.net
    Plurk
    Google+專頁

    春有百花秋有月,
    夏有涼風冬有雪,
    若無閒事在心頭,
    便是人間好時節。

    2012年2月8日 下午 10:42
  • 我沒找出解法,所以目前是更改架構來避開問題。 原本使用partial class來新增欄位,改為使用子類別繼承,子類別與edm間就沒有關聯,可以正確查詢出資料。

    但缺點是 1. Class數變多了。 2. 要存檔時,必須把子類別再轉換回原本的POCO 類別。

    • 已標示為解答 tchsuaskl 2012年2月15日 上午 05:14
    2012年2月13日 上午 06:01
  • 如果你還是很在意以上的問題,建議提供更多資訊,不然就算是"自行解決"的結案吧。

    blog.kkbruce.net
    Plurk
    Google+專頁

    春有百花秋有月,
    夏有涼風冬有雪,
    若無閒事在心頭,
    便是人間好時節。

    2012年2月13日 上午 10:27