2010-10-20 85 views
2

我能够使用来自Microsoft的POCO template生成pocos。它效果很好。是否有可能在实体框架中使用现有类作为POCO

我的问题是我如何修改这个或任何其他模板以使用来自不同装配的现有对象,并将数据加载到它们中。

我尝试去了解它的方式,是创建POCO的使用模板,和PocoGenerator.Context使用现有型号,并且不是修改生成的代码返回而不是其生成的类我clasess。

这给了我可怕的“映射和元数​​据信息找不到EntityType MyType”..这可能是因为我的对象没有数据库中有一些额外的字段。我试图修改实体对象,并删除那些领域,但这会导致一些其他问题..

有人做过这件事吗?

UDPATE

是的,可以使用现有的类。要注意的一件事是,如果某些属性名称或类型之间存在不匹配,则会触发上述无法提供信息的错误。有时候,运行时会给出一个有意义的错误,而且这个错误与不兼容的属性名称有关,但只有在两个类都非常接近的情况下。

无论如何,要使用现有的类作为pocos,只需生成pocos,然后再将生成的类注释掉。比在xxxPocoGenerator.Context.cs中添加要使用的现有对象的必要命名空间。

作为一个附注,我写了下面的代码来比较我现有的类和POCO生成的类,并显示任何不匹配的东西,所以我可以修复它们。

 var properties = typeof(MyExistingClass).GetProperties(); 
     var tproperties = typeof(MyPOCOClass).GetProperties(); 

     Console.WriteLine("---------------------------------Missing or Different Properties--------------------"); 
     List<PropertyInfo> missingOrDifferentProperties = new List<PropertyInfo>(); 
     foreach (var tp in tproperties) 
      if (properties.Where(p => p.Name == tp.Name && p.PropertyType == tp.PropertyType && p.CanRead == tp.CanRead && p.CanWrite == tp.CanWrite && p.IsSpecialName == tp.IsSpecialName && p.MemberType == tp.MemberType).Count() != 1) 
       Console.WriteLine(tp.Name + " :: " + tp.PropertyType.Name); 
+1

主题读取:“是否可以使用激动人心类作为波苏斯实体框架”对不起,您的代码中没有令人兴奋的类。请添加一个令人兴奋的课程,然后重试。 :-) – ChessWhiz 2010-10-20 19:43:52

+0

我修正了标题。 – 2010-10-20 19:46:07

+0

好吧,我只是厌倦了那些不令人兴奋的无聊课程。 – 2010-10-20 21:10:45

回答

1

听起来像你可能正在寻找最新的CTP4实体框架中的Code-First。

http://blogs.msdn.com/b/adonet/archive/2010/07/14/ctp4codefirstwalkthrough.aspx

+0

如果我使用Code-First方法,将创建表吗?因为我不想这样做。表格已经存在,我无法修改它们。我只想使用现有的类,无需手动将实体转换成它们。使用现有的类对我来说是一个很难的要求。 – 2010-10-20 21:18:37

+0

您可以先使用现有数据库的代码,请参阅http://weblogs.asp.net/scottgu/archive/2010/08/03/using-ef-code-first-with-an-existing-database.aspx但是我会告诫你,目前它只是一个CTP,并且存在'问题'。你可能会更好地使用数据库优先,然后使用Automapper在实体框架对象和现有类之间进行映射。 – 2010-10-20 21:37:24