我今天实际上处理了这个问题,因为我的项目的源代码树没有正确设置来运行实体框架的构建任务,该任务在输出 dll 中生成和嵌入资源。
我调查了以下选项:
使用 EntityDeploy msbuild 任务
如果你在记事本中打开你的 .csproj 文件,你应该会看到一些类似的 XML
<EntityDeploy Include="MyEntities.edmx">
<Generator>EntityModelCodeGenerator</Generator>
<LastGenOutput>MyEntities.Designer.cs</LastGenOutput>
</EntityDeploy>
这是 msbuild 任务,它使用Microsoft.Data.Entities.Build.targets和Microsoft.Data.Entities.Build.dll读取 edmx 文件,生成 ssdl、csdl 和 msl 文件,然后将它们嵌入到目标 dll 中。(这些文件可以在C:\Windows\Microsoft.NET\Framework\v3.5中找到)。
使用 EdmGen
正如 Craig 指出的那样,您也许可以使用框架附带的EdmGen.exe 。我试了一下,但我对我的 edmx 文件中的数据进行了一些自定义,EdmGen.exe 似乎真的想从原始数据库进行初始生成。
使用 EdmGen2
EdmGen2.exe是一个比 EdmGen 做更多的开源项目。我最终使用它来生成 ssdl、csdl 和 msl 文件。您只需将其指向您的 edmx 文件,它将生成必要的 ssdl、csdl 和 msl 文件。然后我将这些与我的 dll 一起包含并修改了连接字符串
connectionString="metadata=res://*/MyEntities.csdl|res://*/MyEntities.ssdl|res://*/MyEntities.msl;
到
connectionString="metadata=./MyEntities.csdl|./MyEntities.ssdl|./MyEntities.msl;
注意我告诉实体框架这些文件与我的 dll 位于同一目录中,而不是作为资源嵌入。
所有这三个,构建任务、EdmGen 和 EdmGen2 都是瘦包装器,它们为所有困难的东西调用 System.Data.Entity.dll。作为最后的手段,您可以查看反射器中的构建任务 dll 并查看它在做什么。
希望这可以帮助。