3

我使用一些额外的元数据(例如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 对象?

相关链接:

4

3 回答 3

2

可能有一种直接的方法可以做到这一点,但您可以从全名中获取类型

var types = from entity in entities
            select Type.GetType(entity.FullName);
于 2013-05-22T20:20:13.013 回答
-1

如果我是正确的 - 这应该会有所帮助,因为它描述了我不久前发布的 类似问题:

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

另请查看其他帖子,其中总结了所有内容:

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

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

于 2013-05-22T20:28:39.910 回答
-1

如果它对其他人有帮助,这是我的测试工具代码,用于从我的 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上面的文字来自我认为的努力,YMMV

于 2017-09-05T06:25:58.963 回答