Получить поле идентификации из KeyMembers

Я хотел бы получить KeyMembers где я установил в Edmx StoreGeneratedPattern в Identity Есть ли способ сделать это?

Я могу получить 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 с автоматически увеличивающимися значениями.

2 ответа

Решение

Из заданного MetadataWorkspace, давайте назовем mw, я использую это:

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();
            }

пожалуйста, проверьте

Сгенерированный магазином шаблон находится в содержимом SSDL модели EF. Вот пример того, как вы можете получить свойства со спецификацией идентичности:

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));
}

(где oc является ObjectContext)

Другие вопросы по тегам