2014-02-11 23 views
1

我想獲得KeyMembers,我已經在Edmx中設置了StoreGeneratedPatternIdentity有沒有辦法做到這一點?從KeyMembers獲取標識字段

我可以用這個代碼得到KeyMembers:

private static IEnumerable<EdmMember> GetKeyMembers(string entityName) 
{ 
    var objectContext = EntityModel.ObjectContext; 

    var metaData = objectContext 
     .MetadataWorkspace 
     .GetEntityContainer(objectContext.DefaultContainerName, DataSpace.CSpace) 
     .BaseEntitySets 
     .FirstOrDefault(x => x.ElementType.Name == entityName); 

    return metaData.ElementType.KeyMembers; 
} 

我有這個,它也返回外鍵的問題,但我只是想帶自動遞增值PrimaryKeys。

回答

5

從給定的MetadataWorkspace,我們姑且稱之爲兆瓦,我用這個:

var cSpaceEntities = mw.GetItems(DataSpace.CSpace).OfType<EntityType>(); 

foreach (var entity in cSpaceEntities) { 
    var autoIds = entity.KeyMembers.Where(p => 
         p.MetadataProperties 
          .Any(m => m.PropertyKind == PropertyKind.Extended 
            && Convert.ToString(m.Value) == "Identity")).ToArray(); 
      } 

請測試

+0

對於EF 6個用戶,格特·阿諾德的回答是好,因爲「IsStoreGeneratedIdentity」現已 – George

3

商店生成模式是在EF模型的SSDL內容。這裏是你如何能得到與身份規範屬性的例子:

var items = oc.MetadataWorkspace.GetItems(DataSpace.SSpace).OfType<EntityType>(); 
foreach (var entityType in items) 
{ 
    var props = string.Join(",", entityType.Properties 
       .Where(x => x.IsStoreGeneratedIdentity)); 
    Trace.WriteLine(string.Format("{0}: {1}", entityType.Name, props)); 
} 

(其中ocObjectContext

+0

如何我是否會訪問IsStoreGeneratedIdentity屬性,我得到的消息是其聲明的內部使用EF 5.0在EF 6.x中是公共的? –

+0

啊,我想這是真的。也許喬治的解決方案適用於EF 5. –

+0

另一個理由切換到EF 6.x :) –