42

我試圖在EF4中使用使用VS2010的存儲庫模式。使用實體框架模型在項目中生成POCO類到項目

爲此,我通過右鍵單擊實體模型設計器並單擊添加代碼生成項來使用POCO代碼生成。然後我選擇POCO模板並獲得我的課程。

我希望能夠做的是將我的解決方案組織成實體(POCO)類的單獨項目,以及實體模型和存儲庫代碼的另一個項目。

這意味着我的MVC項目可以將POCO類用於強類型視圖等,而不必知道存儲庫或必須參考它。

爲了將它們連接在一起,我將使用另一個帶接口的獨立項目並使用IoC。

聽起來不錯,我的腦海裏我只是不知道如何生成類到他們自己的項目!我可以複製它們,然後更改它們上的命名空間,但是當我更改數據庫中的模式並想更新模型時,我想避免手動工作。

感謝

回答

38

其實在EF 4.0的T4模板設計與此方案考慮:)

有2個模板:

  • 一類爲實體本身(即ModelName.tt )
  • One for the ObjectContext(ie ModelName.Context.tt)

您應該將ModelName.tt文件放在您的POCO項目中,只需將模板更改爲指向持久感知項目中的EDMX文件即可。

聽起來很奇怪我知道:現在有一個依賴關係,但它是在T4世代,而不是在編譯時!那應該沒問題?因爲由此產生的POCO大會仍然是完全無知的。

請參閱步驟5 & 6個:http://blogs.msdn.com/adonet/pages/walkthrough-poco-template-for-the-entity-framework.aspx瞭解更多信息。

希望這有助於

亞歷

+0

鏈接到msdn博客頁面未找到 –

+0

@AmrElgarhy互聯網存檔以拯救!結帳[http://web.archive.org/web/20110609064124/http://blogs.msdn.com/b/adonet/archive/2010/01/25/walkthrough-poco-template-for-the-entity- framework.aspx](http://web.archive.org/web/20110609064124/http://blogs.msdn.com/b/adonet/archive/2010/01/25/walkthrough-poco-template-for-the -entity-framework.aspx) – natenho

+0

您的先生是一個傳奇! :D – MickyD

6

@Nick,

  1. 要強制POCO實體的再生,你只需要右鍵單擊主.TT文件,並選擇「運行自定義工具「。這將強制它重新生成POCO類,並對.edmx模型進行更新。
  2. 是否有任何問題與您繼續並右鍵單擊該模型並選擇「從模型生成數據庫...」即使您不一定要生成數據庫?這將最有可能擺脫你的'錯誤11007 ...'。
  3. 我認爲這相當於一個「代碼隱藏」。我不知道更多。

另外還有一件事要注意Alex給出的鏈接。一旦我移動我的主。tt文件複製到不同的項目中,從「.Context.tt」文件生成的文件將不會編譯,因爲它缺少對位於不同名稱空間中的POCO文件的引用(因爲我想讓我的ObjectContext處於與我的POCO文件不同的域)。我必須修改「.Context.tt」文件,使其具有using Poco.Namespace(其中Poco.Namespace是生成POCO文件的名稱空間的名稱)。這就允許我的項目進行編譯。

喬爾

+0

re:2.編譯時,我現在得到每個實體的警告:'錯誤11007:實體類型XXXX未映射。'。這可能與沒有生成數據庫(?)有關,但是在編輯edmx之前(使用xml編輯器)刪除那裏的映射(儘管它對我來說看起來很完美)之前沒有發生,然後去了回到設計者並使用該工具添加映射。 – 2011-04-04 19:44:13

+0

我有這個*確切*與「.Context.tt」文件相同的問題,並希望添加一個'使用'語句,確實工作。問題是該文件是自動生成的。如果模型必須更新,'using'語句將不得不被刪除並重新添加。任何更好的方法來解決這個問題 – atconway

+0

沒關係,只要看看Alex的鏈接就知道了。滾動到名爲** 7的部分。將「Blogging.Context.tt」命名空間更改爲匹配「實體」** Context.tt屬性中的** Custom Tool命名空間**可以更新爲「MyProject.Model」,並且引用將解析。 – atconway

1

我已經使用這種方法與動態數據項目和控制相結合時遇到一個嚴重的錯誤。基本上,你會得到一個錯誤。

「無法確定MetaTable無法爲數據源'EntityDataSource1'確定MetaTable,並且無法從請求URL推斷出一個。請確保該表映射到數據源,或者數據源使用有效的上下文類型和表名稱進行配置,或者該請求是註冊的DynamicDataRoute的一部分。「

3

對於EF5 + DbContext生成器:很容易將您的Name.Context.tt移動到不同的項目。但是,您需要引用模型類。您可以手動執行此操作,但這需要您在每次生成代碼時都更改它。您也可以爲兩個項目使用相同的命名空間。這是有效的,並會工作,但我認爲這是糟糕的設計。另一種選擇是更改T4模板(Name.Context.tt)。

更改此設置(第43行):

using System; 
using System.Data.Entity; 
using System.Data.Entity.Infrastructure; 
<# 
if (container.FunctionImports.Any()) 
{ 
#> 

要這樣:

using System; 
using System.Data.Entity; 
using System.Data.Entity.Infrastructure; 
<# 
if (modelNamespace != codeNamespace) 
#> 
using <#=code.EscapeNamespace(modelNamespace)#>; 
<# 
if (container.FunctionImports.Any()) 
{ 
#> 

這將檢查你的模型命名空間從您的代碼命名空間的不同,如果是的話,它會使用插入所需引用你的模型類。

相關問題