Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用实体框架模型在不同项目中生成POCO类_.net_Entity Framework_Code Generation_Repository Pattern_Poco - Fatal编程技术网

.net 使用实体框架模型在不同项目中生成POCO类

.net 使用实体框架模型在不同项目中生成POCO类,.net,entity-framework,code-generation,repository-pattern,poco,.net,Entity Framework,Code Generation,Repository Pattern,Poco,我正在尝试使用VS2010将存储库模式与EF4结合使用 为此,我通过右键单击实体模型设计器并单击添加代码生成项来使用POCO代码生成。然后我选择POCO模板并获取我的类 我希望能够将我的解决方案结构化为实体(POCO)类的单独项目和实体模型和存储库代码的另一个项目 这意味着我的MVC项目可以将POCO类用于强类型视图等,而无需了解存储库或对其进行引用 为了把它们连接在一起,我将有另一个带有接口的独立项目,并使用IoC 听起来不错,我只是不知道如何将类生成到自己的项目中!我可以复制它们,然后更改它

我正在尝试使用VS2010将存储库模式与EF4结合使用

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

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

这意味着我的MVC项目可以将POCO类用于强类型视图等,而无需了解存储库或对其进行引用

为了把它们连接在一起,我将有另一个带有接口的独立项目,并使用IoC

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


感谢

事实上,EF 4.0中的T4模板是在设计时考虑到了以下场景:)

有两个模板:

  • 一个用于实体本身(即ModelName.tt)
  • 一个用于ObjectContext(即ModelName.Context.tt)
您应该将ModelName.tt文件放在POCO项目中,只需将模板更改为指向持久性感知项目中的EDMX文件

听起来很奇怪,我知道:现在有一个依赖项,但它是在T4生成时,而不是在编译时!那应该没问题吧?因为生成的POCO程序集仍然完全不知道持久性

有关更多信息,请参见本指南的步骤5和6

希望这有帮助

亚历克斯,尼克

  • 要强制重新生成POCO实体,只需右键单击main.tt文件并选择“运行自定义工具”。这将迫使它使用对.edmx模型的更新更改重新生成POCO类
  • 尽管不一定要生成数据库,但继续右键单击模型并选择“从模型生成数据库…”是否有任何问题?这很可能会消除您的“错误11007…”
  • 我认为这相当于“代码隐藏”。我只知道这些
  • 关于Alex给出的链接,还有一点需要注意。一旦我将主.tt文件移动到另一个项目,从“.Context.tt”文件生成的文件将无法编译,因为它缺少对位于不同命名空间中的POCO文件的引用(因为我希望我的ObjectContext位于与POCO文件不同的域中)。我不得不使用Poco.Namespace修改“.Context.tt”文件,使其具有
    (其中
    Poco.Namespace
    是生成Poco文件的命名空间的名称)。这样就可以编译我的项目了


    Joel

    For EF5+DbContext generator:很容易将您的Name.Context.tt移动到其他项目。但是,您需要引用模型类。您可以手动执行此操作,但这将要求您在每次生成代码时对其进行更改。您还可以为两个项目使用相同的命名空间。这是有效的,会起作用,但我认为这是一个糟糕的设计。另一种选择是更改T4模板(Name.Context.tt)

    更改此项(第43行):

    使用系统;
    使用System.Data.Entity;
    使用System.Data.Entity.Infrastructure;
    
    为此:

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

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

    re:2。编译时,我现在收到每个实体的警告:“错误11007:实体类型XXXX未映射。”。这可能与没有生成数据库(?)有关,但在我编辑edmx(使用xml编辑器)以删除其中的映射(尽管它看起来很完美)之前,这并没有发生。然后,我回到设计器并使用该工具添加映射。我对“.Context.tt”有着完全相同的问题文件,并希望使用有效的
    语句添加一个
    。问题是文件是自动生成的。如果必须更新模型,则必须删除并重新添加
    using
    语句。有没有更好的方法来解决这个问题?没关系,只要看看Alex的链接就知道了。滚动到名为7的部分。更改“Blogging.Context.tt”名称空间以匹配“Entities”Context.tt属性上的自定义工具名称空间可以更新为MyProject.Model
    found@AmrElgarhy互联网档案拯救!先生,你真是个传奇人物D“…但这将要求您在每次生成代码时对其进行更改…”-如果您的意思是当由EDMX或其他程序重新生成TT文件时,那么我通常会提前在源代码管理中使用TT,并简单地恢复更改
    
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    <#
    if (modelNamespace != codeNamespace)
    #>
    using <#=code.EscapeNamespace(modelNamespace)#>;
    <#
    if (container.FunctionImports.Any())
    {
    #>