因為之前有一陣子在 Study 有關 Dynamic LINQ 的資訊,所以有時候會在測試時遇到一些問題,例如說這一篇的主題,我要怎麼去抓出每個 Entity 的主鍵成員有哪些?在點部落中「亂馬客」有一篇文章就有說明:
[EF]如何取得ADO.NET Entity Framework中某Table的主鍵值設定
不過亂馬客所提供的方法只能取得一個主鍵成員的資料,如果說一個 Entity 不只一個主鍵成員的話,就要做一點小改變。
取得 Entity 的主鍵成員資訊,可取得多個主鍵成員資訊:
public List<PropertyInfo> GetPK(EntityObject value){PropertyInfo[] properties = value.GetType().GetProperties();
List<PropertyInfo> infos = new List<PropertyInfo>();
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){infos.Add(pI);}}else if (attribute is ColumnAttribute){if ((attribute as ColumnAttribute).IsPrimaryKey == true){infos.Add(pI);}}}}return infos;
}
而在資料庫是使用 MS SQL Server 的執行結果為:
如果資料庫是使用 Oracle 的執行結果為:
基本上這個方法都是判斷 Entity 所定義的實體物件對每個 Property 所標註的 EdmScalarPropertyAttribute ,
在這個 Attribute 中可以依據「EntityKeyProperty」判斷是否為主鍵,
MSDN - EdmScalarPropertyAttribute.EntityKeyProperty 屬性
然而也還是可以使用其他的方式來取得 EntityObject 的主鍵成員資料,可以經由 EntitySet 中的 ElementType 然後再由 ElementType 屬性 的 KeyMembers 屬性來取得,
MSDN - EntitySet 類別
http://msdn.microsoft.com/zh-tw/library/bb301300(v=vs.100).aspx
MSDN - EntitySetBase 類別
http://msdn.microsoft.com/zh-tw/library/bb360450(v=vs.100).aspx
MSDN - EntitySetBase.ElementType 屬性
http://msdn.microsoft.com/zh-tw/library/system.data.metadata.edm.entitysetbase.elementtype.aspx
MSDN - EntityTypeBsae.KeyMembers 屬性
http://msdn.microsoft.com/zh-tw/library/system.data.metadata.edm.entitytypebase.keymembers.aspx
直接來看看程式的內容:
public IEnumerable<string> GetEntityKeyProperties(EntitySetBase entitySet){return GetEntityKeyProperties(entitySet.ElementType);
}public IEnumerable<string> GetEntityKeyProperties(EntityTypeBase entityType){return entityType.KeyMembers.Select(x=>x.Name);
}
因為我只是要抓出 Entity 的主鍵成員名稱,所以只需要傳出 KeyMember 的 Name 就可以。
資料庫使用 MS SQL Server 的執行結果:
資料庫使用 Oracle 的執行結果:
參考資料:
MSDN 「C#如何取得ADO.NET實體資料模型中某Table的主鍵值設定」
http://social.msdn.microsoft.com/Forums/zh-TW/238/thread/80abc18e-c131-4a9c-b290-223a4450f178
點部落 - 亂馬客「[EF]如何取得ADO.NET Entity Framework中某Table的主鍵值設定」
http://www.dotblogs.com.tw/rainmaker/archive/2011/12/13/61795.aspx
stackoverflow - Entity Framework 4 How to find the primary key?
http://stackoverflow.com/questions/2958921/entity-framework-4-how-to-find-the-primary-key
以上
沒有留言:
張貼留言