EF CodeFirst:获取DbContext的所有POCO类型

7
有没有一种方法可以从指定的DbContext实例中获取POCO的类型?

你遇到了同样的问题吗?你解决了吗?我需要帮助.. =/ - Fernando Meneses Gomes
3个回答

6
很抱歉,我无法编辑已接受的答案 - 您只需要按以下方式更改使用的数据空间。
var items = mdw.GetItems<EntityType>(DataSpace.OSpace);

获取你的POCO类而不是EF代理。


6
您需要访问 MetadataWorkspace
public class MyContext : DbContext
{

    public void Test()
    {            
        var objectContext = ((IObjectContextAdapter)this).ObjectContext;

        var mdw = objectContext.MetadataWorkspace;

        var items = mdw.GetItems<EntityType>(DataSpace.CSpace);
        foreach (var i in items)
        {
            Console.WriteLine("Class Name: {0}", i.Name);
        }
 }

谢谢,但我需要访问POCO类Type、属性和属性特性——EntityType实例在Properties、PropertiesMetadata等方面返回自己的实现。 - DrAlligieri
@DrAlligieri 您可以获取类型的完整名称,然后使用反射来访问属性和特性。 - Eranga
FullName返回“CodeFirstDatabaseSchema.TypeNameThere”,CodeFirstDatabaseSchema是POCO类的错误命名空间。 - DrAlligieri
@DrAlligieri 是的。我猜你需要通过 Assembly.GetTypes() 并匹配名称来获取类型。 - Eranga
@Eranga,你上面的代码非常简单,我喜欢它。你已经获得了所有实体名称(字符串)。如何获取所有实体类型(Type)?有没有不使用反射的方法? - Lei Yang
你遇到了同样的问题吗?你解决了吗?我需要帮助.. =/ - Fernando Meneses Gomes

3

@Lei Yang:您可以使用此功能将所有类型转换为列表。

var objectContext = ((IObjectContextAdapter) dbContext).ObjectContext;
var mdw = objectContext.MetadataWorkspace;
var items = mdw.GetItems<EntityType>(DataSpace.CSpace);

var dbContextAssembly = dbContext.GetType().Assembly;

var entityTypes = new List<Type>();
foreach (var i in items) {
    entityTypes.Add(dbContextAssembly.GetType(i.FullName));
}

i.FullName没有正确的命名空间,它以某种方式具有映射命名空间。 - Najera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接