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()) 
{ 
#> 

这将检查你的模型命名空间从您的代码命名空间的不同,如果是的话,它会使用插入所需引用你的模型类。

相关问题