none
C#如何取得ADO.NET實體資料模型中某Table的主鍵值設定 RRS feed

  • 問題

  •   各位大大好...小弟想實做一個方法...傳入特定的Primary Key Value...透過LINQ to Entity動態組出Entity SQL查詢語法並將查詢結果轉成IQueryable<object>後回傳。

      雖然可以加開一個參數由呼叫端傳入該Table的PK設定...但因為資料庫才剛開始準備設計...未來可能因為需求或架構上的異動而調整資料表的PK設定...非常不希望以後每次異動資料表PK的時候就得重新調整一次程式碼(因為這樣做真的很呆)...所以想用在程式中動態取得的方式進行...原本想用EntityObject.EntityKey的方式取得...但程式執行期間EntityObject其實是空的而導致發生Exception...請問各位大大小弟該如何動態取得"ADO.NET實體資料模型"中某個特定Table的主鍵值設定呢?

      麻煩各位大大幫幫小弟...

    ps.我使用的開發工具是VS2010,使用DotnetFramework4.0,程式語言是C#

    2011年12月9日 上午 07:19

解答

所有回覆

    • 已標示為解答 海豚小村 2011年12月13日 上午 06:04
    2011年12月9日 上午 08:46
  • 謝謝TerryChuang大大的連結提供...

    針對以下這個連結...我有一些困惑...

    http://stackoverflow.com/questions/2958921/entity-framework-4-how-to-find-the-primary-key

    若套用這樣的模式實做...勢必在每個物件實體類別都必須自行實做才可行...針對小系統而言應該是可行的...但是若針對中大型系統而言...會是一個沉重的負擔...原本我的想法是希望將這個功能實做在底層(使用共用型別而不需要在每隻程式中自行針對資料表類別實做)...以減輕開發時的工作量...不知是否有更好的方式可以進行...

    不曉得我的理解是否正確...還麻煩TerryChuang大大指教...謝謝...


    2011年12月9日 上午 11:00
  • 指教不敢,只是互相討論罷了。

    聽起來你的理解應該沒錯,不過感覺你想做在底層,要能一體適用所有Entity需要詳細規劃,不過有時候在彈性以及可維護性需要做取捨,或許這也是需要考慮的一個部分。


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    2011年12月12日 下午 02:06
  • 那請教一下...是否還有看過其他方式可以達成取得Entity物件的PKey且可符合彈性與可維護性?

    2011年12月13日 上午 05:50
  • 可以寫個EntityObject的Extension Method,使用起來如下的方式,

    MYEntityObj myE = new MYEntityObj();
    PropertyInfo myEpk = myE.GetPK();
    

    PropertyInfo mypk2 = (new MYEntityObj()).GetPK();
    


    Extension Method Code如下,

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    using System.Reflection;
    using System.Data.Objects.DataClasses;
    //要加入 System.Data.Linq.dll 參考
    using System.Data.Linq.Mapping;
    
    namespace WindowsFormsApplication2
    {
        public static class MyDBExtension
        {
            public static PropertyInfo GetPK(this EntityObject value)
            {
                PropertyInfo[] properties = value.GetType().GetProperties();
                foreach (PropertyInfo pI in properties)
                {
                    System.Object[] attributes = pI.GetCustomAttributes(true);
                    foreach (object attribute in attributes)
                    {
                        if (attribute is EdmScalarPropertyAttribute)
                        {
                            if ((attribute as EdmScalarPropertyAttribute).EntityKeyProperty == true)
                                return pI;
                        }
                        else if (attribute is ColumnAttribute)
                        {
    
                            if ((attribute as ColumnAttribute).IsPrimaryKey == true)
                                return pI;
                        }
                    }
                }
                return null;
            }
      
           
        }
    }
    



    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2011年12月13日 上午 06:36