Entity framework 从元数据工作区上的实体类型获取鉴别器值

Entity framework 从元数据工作区上的实体类型获取鉴别器值,entity-framework,entity-framework-6,discriminator,Entity Framework,Entity Framework 6,Discriminator,是否有方法使用元数据工作区获取给定DbContext和实体type上的鉴别器值?我希望能找到这样的东西 使用方法如下: public class MyContext : DbContext { public DbSet<Foo> Foo { get; set; } } public class FooBase { } public class Foo : FooBase { } public void Test() { // should be "Foo"

是否有方法使用元数据工作区获取给定
DbContext
和实体
type
上的鉴别器值?我希望能找到这样的东西

使用方法如下:

public class MyContext : DbContext
{
    public DbSet<Foo> Foo { get; set; }
}
public class FooBase
{
}
public class Foo : FooBase
{
}

public void Test()
{
    // should be "Foo"
    var discriminator = GetDiscriminatorValue(typeof(Foo), new MyContext());
}
public static string GetDiscriminatorValue(Type type, DbContext context)
{
    //...
}
公共类MyContext:DbContext
{
公共DbSet Foo{get;set;}
}
公共类食品库
{
}
公共类Foo:FooBase
{
}
公开无效测试()
{
//应该是“Foo”
var discriminator=GetDiscriminatorValue(typeof(Foo),new MyContext());
}
公共静态字符串GetDiscriminatorValue(类型,DbContext上下文)
{
//...
}

我想我可以用以下方法解决这个问题

public static string GetDiscriminatorValue(this DbContext context, Type type)
{
    var metadata = ((IObjectContextAdapter)context).ObjectContext.MetadataWorkspace;

    // Get the mapping between CLR types and metadata OSpace
    var objectItemCollection = ((ObjectItemCollection)metadata.GetItemCollection(DataSpace.OSpace));

    // Get the entity type from the model that maps to the CLR base type of the given type
    var entityType = metadata
            .GetItems<EntityType>(DataSpace.OSpace)
            .Single(e => objectItemCollection.GetClrType(e) == type.BaseType);

    // Get the entity set that uses this entity type
    var entitySet = metadata
        .GetItems<EntityContainer>(DataSpace.CSpace)
        .Single()
        .EntitySets
        .Single(s => s.ElementType.Name == entityType.Name);

    // Find the mapping between conceptual and storage model for this entity set
    var mapping = metadata.GetItems<EntityContainerMapping>(DataSpace.CSSpace)
            .Single()
            .EntitySetMappings
            .Single(s => s.EntitySet == entitySet);

    // Find the value condition (discriminator) that the given type is mapped
    var discriminator = mapping
        .EntityTypeMappings
        .Single(e => e.EntityType?.Name == type.Name)
        .Fragments
        .Single()
        .Conditions
        .OfType<ValueConditionMapping>()
        .Single();

    return (string)discriminator.Value;
}
公共静态字符串GetDiscriminatorValue(此DbContext上下文,类型)
{
变量元数据=((IObjectContextAdapter)上下文).ObjectContext.MetadataWorkspace;
//获取CLR类型和元数据OSpace之间的映射
var objectItemCollection=((objectItemCollection)metadata.GetItemCollection(DataSpace.OSpace));
//从映射到给定类型的CLR基类型的模型中获取实体类型
var entityType=元数据
.GetItems(DataSpace.OSpace)
.Single(e=>objectItemCollection.GetClrType(e)=type.BaseType);
//获取使用此实体类型的实体集
var entitySet=元数据
.GetItems(DataSpace.CSpace)
.Single()
.实体集
.Single(s=>s.ElementType.Name==entityType.Name);
//查找此实体集的概念模型和存储模型之间的映射
var mapping=metadata.GetItems(DataSpace.CSSpace)
.Single()
.EntitySetMappings
.Single(s=>s.EntitySet==EntitySet);
//查找映射给定类型的值条件(鉴别器)
var鉴别器=映射
.EntityTypeMappings
.Single(e=>e.EntityType?.Name==type.Name)
.碎片
.Single()
条件
第()类
.Single();
返回(字符串)鉴别器.Value;
}