2010-10-20 69 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