C# 从实体框架6模型中分离POCO对象类和DBContext

C# 从实体框架6模型中分离POCO对象类和DBContext,c#,.net,entity-framework-6,C#,.net,Entity Framework 6,我开始使用EntityFramework6.0.1版本。我想将生成的DbContext和POCO模板类从模型中分离到不同的类库中。我花了几个小时解决了这个问题,但没有成功 如果创建新类库,请添加EF 6 EntityObject Generator并填充以下模板变量: SourceCsdlPath=@.\..\DataAccess\Model.edmx” 生成后,在错误列表中获取以下错误: 运行转换时出现错误2:System.IO.FileNotFoundException: 找不到文件名: '

我开始使用EntityFramework6.0.1版本。我想将生成的DbContext和POCO模板类从模型中分离到不同的类库中。我花了几个小时解决了这个问题,但没有成功

如果创建新类库,请添加EF 6 EntityObject Generator并填充以下模板变量:

SourceCsdlPath=@.\..\DataAccess\Model.edmx”

生成后,在错误列表中获取以下错误:

运行转换时出现错误2:System.IO.FileNotFoundException: 找不到文件名: 'C:\Source\EFsource\POCO….\DataAccess\SZOSZRDBModel.edmx'

服务器堆栈跟踪:在 Microsoft.VisualStudio.TextTemplating.VSHost.TextTemplatingService.ResolvePath(字符串 路径)在 System.Runtime.Remoting.Messaging.StackBuilderSink.\u PrivateProcessMessage(IntPtr md,对象[]args,对象服务器,对象[]和outArgs)位于 System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage 味精)

在[0]处重试异常:在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg)在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData,Int32类型)at Microsoft.VisualStudio.TextTemplating.ItextTemplatingGenEngineHost.ResolvePath(字符串 路径)在 Microsoft.VisualStudio.TextTemplating31479401930D2C4820ACF716B5389A24A5053726798D9718DB676B3FFA3454B3CB1EDE2E1C2267D5278B1528860C072E81A0E4647BC2393669604048FCD.生成的文本转换。应用程序设置(用户设置 用户设置)位于 Microsoft.VisualStudio.text模板31479401930D2C4820ACF716B5389A24A5053726798D9718DB676B3FFA3454B3CB1EDE2E1C2267D5278B1528860C072E81A0E4647BC2393669604048FCD.GeneratedTextTransformation.TransformText()

错误信息很清楚,但我不知道如何在没有完全绝对路径的情况下设置模型路径


我不确定,使用最新版本的实体框架是最好的主意…

不需要绝对路径。看起来您的相对路径不正确。我正在使用EF6.1,我在一个单独的项目中有POCO类。这就是我如何在VS 2013中实现它的

  • 创建了类库项目并添加了
    ADO.NET实体数据模型
    。此项目将包含
    DB上下文
  • DbContext
    项目中添加了一个新的
    EF6.x DbContext生成器
  • 创建了一个新的类库项目。此项目将包含
    POCO
    对象
  • [Project Name]Model.tt
    文件从
    DbContext
    项目移动到
    POCO
    项目
  • 编辑了
    [Project Name]Model.tt
    文件。在第5行,我更改了:
    conststringinputfile=@“SampleModel.edmx”
    
    收件人:
    const string inputFile=@.\DbContext\SampleModel.edmx”
  • DbContext
    项目中的引用添加到
    POCO
    项目中
  • 如果您使用的是VS 2013,则可以调试模板以查看如何解析相对路径

  • .tt
    文件中添加断点
  • 右键单击解决方案资源管理器中的
    .tt
    文件,然后选择“调试T4模板”

  • 你想要
    @“\..\..\DataAccess\Model.edmx”
    ?我不明白你的问题。我想设置项目的另一个文件夹,但我无法在目录树中向上导航。谢谢你的帮助,伙计!这对我有用。祝你过得愉快!:)@弗雷米斯,你的POCO有没有像EF4那样的基本类型?在DB-First方法中,生成的POCO都标记为partial,但看起来它们根本不是从任何东西派生的。。。分部关键字允许我将类的定义扩展到多个文件中。当我需要重新生成DTO时,T4模板将覆盖代码生成的文件,但我的“手动编辑”文件不受影响。我编辑T4模板以生成具有以下命名约定的文件:[类名].base.cs。然后创建名为[class name].cs的类。未生成的文件将使用接口扩展“基本”生成的文件。如果您感兴趣,我可以提供一个具体的示例。我认为您还需要更改*.tt文件属性中的自定义工具名称空间,以与包含edmx文件的项目中的默认名称空间相对应。
    DbContext
    项目需要引用
    POCO
    项目,但是,如果
    POCO
    项目想要做任何有用的事情,它必须引用
    DbContext
    项目,这将导致循环依赖,这是不允许的。我猜您的` POCO项目只是应用程序项目中的另一个子项目。