Получить поле идентификации из 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
)