从EF中的EntityType中获取EntitySet名称

时间:2010-04-21 20:44:10

标签: entity-framework

给定一个EntityType,例如“Contact”,如何从中派生出它所属的EntitySet的名称,即“Contacts”之类的复数?

3 个答案:

答案 0 :(得分:32)

如果您已经有一个附加实体(显然您不需要第一行,只需使用您现有的实体):

  Contact c = context.Contacts.Where(x => x.blah).FirstOrDefault();
  string setName = c.EntityKey.EntitySetName;

或者如果你不这样做:

 string className = typeof(Contact).Name
 var container =   
    context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace);
    string setName = (from meta in container.BaseEntitySets
                                          where meta.ElementType.Name == className
                                          select meta.Name).First();

答案 1 :(得分:6)

此扩展程序可能有用

public static class MyExtensions
{
    public static string GetEntitySetName<T>(this ObjectContext context)
    {
        string className = typeof(T).Name;

        var container = context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace);
        string entitySetName = (from meta in container.BaseEntitySets
                                where meta.ElementType.Name == className
                                select meta.Name).First();

        return entitySetName;
    }
}

并使用它:

db.AttachTo(db.GetEntitySetName<MyEntityType>(), myEntityInstance);

答案 2 :(得分:0)

这是一种与接受的答案类似的方法,除了它支持a)代理类型(例如,如果您动态获取EF6实体的类型,则其类型可能是“ Contact_1A2B3C4D5E “,而不是“ Contact”)和b)继承(按类型,按层次结构表)。

private static string GetEntitySetName(ObjectContext objectContext, Type type)
{
    if (objectContext == null) throw new ArgumentNullException(nameof(objectContext));
    if (type == null) throw new ArgumentNullException(nameof(type));

    EntityContainer container = objectContext.MetadataWorkspace.GetEntityContainer(objectContext.DefaultContainerName, DataSpace.CSpace);

    return container.BaseEntitySets
        .Where(x =>
            (x.ElementType.Name == type.Name) ||
            (x.ElementType.Name == type.BaseType?.Name) ||
            (x.ElementType.Name == type.BaseType?.BaseType?.Name)
        )
        .Select(x => x.Name)
        .FirstOrDefault() ?? throw new ArgumentException($"Specified type is not an entity type.", nameof(type));
}