使用Entity Framework模型在项目的不同项目中生成POCO类

时间:2010-03-17 18:36:44

标签: .net entity-framework code-generation repository-pattern poco

我正在尝试使用VS2010与EF4一起使用存储库模式。

为此,我通过右键单击实体模型设计器并单击添加代码生成项来使用POCO代码生成。然后我选择POCO模板并获取我的课程。

我希望能够将我的解决方案结构化为Entity(POCO)类的单独项目以及实体模型和存储库代码的另一个项目。

这意味着我的MVC项目可以将POCO类用于强类型视图等,而不必了解存储库或必须引用它。

要将它们全部插入,我将有另一个带接口的独立项目并使用IoC。

听起来很好我只是不知道如何将类生成到自己的项目中!我可以复制它们,然后更改它们上的命名空间,但是每当我更改数据库中的模式并希望更新我的模型时,我都希望避免手动工作。

由于

3 个答案:

答案 0 :(得分:38)

实际上,EF 4.0中的T4模板在设计时考虑了这种情况:)

有两个模板:

  • 一个实体本身(即ModelName.tt)
  • 一个用于ObjectContext(即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了解更多。

希望这有帮助

Alex

答案 1 :(得分:5)

@Nick,

  1. 要强制重新生成POCO实体,只需右键单击主.tt文件并选择“运行自定义工具”即可。这将强制它使用对.edmx模型的更新更改来重新生成POCO类。
  2. 您是否有任何问题,即使您不一定生成数据库,也可以右键单击模型并选择“从模型中生成数据库...”这很可能会摆脱你的'错误11007 ......'。
  3. 我认为它等同于“Code Behind”。我不知道更多。
  4. 另外还要注意Alex给出的链接。一旦我将主.tt文件移动到另一个项目,从“.Context.tt”文件生成的文件将无法编译,因为它缺少对位于不同命名空间中的POCO文件的引用(因为我想要我的ObjectContext与我的POCO文件位于不同的域中)。我不得不修改“.Context.tt”文件以获得using Poco.Namespace(其中Poco.Namespace是生成POCO文件的命名空间的名称)。然后这允许我的项目编译。

    乔尔

答案 2 :(得分:4)

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

这将检查您的模型名称空间是否与您的代码名称空间不同,如果是,它将插入所需的用于引用您的模型类。

相关问题