给定一个EntityType,例如“Contact”,如何从中派生出它所属的EntitySet的名称,即“Contacts”之类的复数?
答案 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));
}