Question

I would like to get the KeyMembers where I have set in the Edmx the StoreGeneratedPattern to Identity is there a way to do this?

I can get the KeyMembers with this code:

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

The problem I have with this that it also returns foreign keys, but I just want to get PrimaryKeys with auto incrementing values.

Was it helpful?

Solution

From a given MetadataWorkspace, let's call mw, i use this:

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

please test

OTHER TIPS

The store-generated pattern is in the SSDL content of the EF model. Here's an example of how you can get the properties with identity specification:

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

(where oc is an ObjectContext)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top