繁体   English   中英

如何从实体框架元数据EntityType对象中获取相应的POCO对象类型?

[英]How do I get the corresponding POCO object Type from an Entity Framework Metadata EntityType object?

我已经使用一些额外的元数据(例如DataTypeAttribute或可能是新的自定义属性)注释了我的Entity Framework Code First对象。 此代码的一个版本(来自http://www.minddriven.de/index.php/technology/dot-net/web/asp-net-mvc/check-data-annotations-from-code )很适合阅读一旦我拥有EF Code First POCO对象的Type对象,就会生成属性。

但是,我无法弄清楚如何从MetadataWorkspace中找到所有实体:

ObjectContext objContext = ((IObjectContextAdapter)this).ObjectContext;
MetadataWorkspace mw = objContext.MetadataWorkspace;
var entities = mw.GetItems<EntityType>(DataSpace.OSpace);

到POCO类我需要反思属性。

如何从EntityType到POCO对象或其代理? 或者,如何在没有GetItems()的情况下找到上下文中的所有POCO对象?

相关链接:

可能有直接的方法来执行此操作,但您可以从全名获取类型

var types = from entity in entities
            select Type.GetType(entity.FullName);

如果它对其他人有帮助,那么我的测试工具代码用于从我的EF设置(特别是Effort CSV数据库)转储我的DbContext POCO代理:

        MyContext ctx = new MyContext();
        var metadata = ((IObjectContextAdapter)ctx).ObjectContext.MetadataWorkspace;
        var schema = metadata.GetItems(DataSpace.SSpace).ToList();
        Dictionary<string, List<string>> tables = new Dictionary<string, List<string>>();
        Dictionary<string, System.Data.Entity.Core.Metadata.Edm.EntityType> types = new Dictionary<string, System.Data.Entity.Core.Metadata.Edm.EntityType>();
        Dictionary<string, string> table_names = new Dictionary<string, string>();
        foreach (var item in schema)
        {
            if (item.ToString().Contains("CodeFirstDatabaseSchema") && !item.ToString().Contains("_"))
            {
                string[] tableItem = item.ToString().Split('.');
                string name = tableItem[1];
                Debug.WriteLine("table_name: " + name);

                if (!tables.ContainsKey(name))
                {
                    System.Data.Entity.Core.Metadata.Edm.EntityType entity_type = item as System.Data.Entity.Core.Metadata.Edm.EntityType;
                    if (entity_type != null)
                    {
                        List<string> columns = new List<string>();
                        var members = entity_type.DeclaredMembers;
                        foreach (var member in members)
                        {
                            columns.Add(member.ToString());
                        }
                        Debug.WriteLine("columns:\n" + string.Join(",", columns));
                        tables.Add(name, columns);
                        types.Add(name, entity_type);
                        table_names.Add(name, item.MetadataProperties["TableName"].Value.ToString());
                    }
                }
            }
        }
        foreach (var table_name in tables.Keys)
        {
            List<string> columns = tables[table_name];
            System.Data.Entity.Core.Metadata.Edm.EntityType entity = types[table_name];
            string table_csv_name = table_names[table_name] + ".csv";
            Debug.WriteLine("table_csv_name: " + table_csv_name);
            var assembly_name = AssemblyName.GetAssemblyName("MyDLL.dll");
            var proxy = metadata.GetItems<System.Data.Entity.Core.Metadata.Edm.EntityType>(DataSpace.OSpace).Where(v => v.Name == table_name).FirstOrDefault();
            Type proxy_type = Type.GetType(proxy.FullName + ", " + assembly_name.FullName);
            if (proxy_type != null)
            {
                var set = ctx.Set(proxy_type);
                foreach (var row in set)
                {
                    Debug.WriteLine("row: " + row);
                }
            }
        }

然后我得到了代码,通过POCO属性上的反射将DbSet对象转储回csv。 注意上面的CodeFirstDatabaseSchema文字来自我认为的CodeFirstDatabaseSchema

如果我对你想要的是正确的 - 这应该有所帮助,因为它描述了我刚才发布的类似问题

如何检查单元测试在ORM模型中计算的属性标记?

另请查看这篇文章,总结一下:

获取模型架构以使用不支持CreateDatabase的提供程序以编程方式创建数据库
(都是我早先的帖子)

简而言之,我设法阅读了大部分信息 - 但它并不完美(如果我没记错的话,我现在无法检查)并且在某些情况下会出现一些问题,具体取决于您的需求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM