2012年4月18日 星期三

取得 Entity Framework 中 Entity 的主鍵成員名稱(KeyMember)

因為之前有一陣子在 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 的執行結果為:

image

如果資料庫是使用 Oracle 的執行結果為:

image

 

基本上這個方法都是判斷 Entity 所定義的實體物件對每個 Property 所標註的 EdmScalarPropertyAttribute ,

在這個 Attribute 中可以依據「EntityKeyProperty」判斷是否為主鍵,

image

 

MSDN - EdmScalarPropertyAttribute.EntityKeyProperty 屬性

http://msdn.microsoft.com/zh-tw/library/system.data.objects.dataclasses.edmscalarpropertyattribute.entitykeyproperty(v=vs.100).aspx

 


然而也還是可以使用其他的方式來取得 EntityObject 的主鍵成員資料,可以經由 EntitySet 中的 ElementType 然後再由 ElementType 屬性 的 KeyMembers 屬性來取得,

image

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 的執行結果:

image

 

資料庫使用 Oracle 的執行結果:

image

 


 

參考資料:

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

 

以上

沒有留言:

張貼留言

提醒

千萬不要使用 Google Talk (Hangouts) 或 Facebook 及時通訊與我聯繫、提問,因為會掉訊息甚至我是過了好幾天之後才發現到你曾經傳給我訊息過,請多多使用「詢問與建議」(在左邊,就在左邊),另外比較深入的問題討論,或是有牽涉到你實作程式碼的內容,不適合在留言板裡留言討論,請務必使用「詢問與建議」功能(可以夾帶檔案),謝謝。