
[英]How to model POCO object from a multilanguage database with Entity Framework 4?
[英]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
如果我对你想要的是正确的 - 这应该有所帮助,因为它描述了我刚才发布的类似问题 :
另请查看这篇文章,总结一下:
获取模型架构以使用不支持CreateDatabase的提供程序以编程方式创建数据库
(都是我早先的帖子)
简而言之,我设法阅读了大部分信息 - 但它并不完美(如果我没记错的话,我现在无法检查)并且在某些情况下会出现一些问题,具体取决于您的需求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.