使用您的asp.net项目部署的UI项目(特别是EF:EntityFramework.SqlServer.dll的sql服务器驱动程序)部署实体框架是否有更优雅的方式,而不是通过添加对EF的引用您的UI项目中的NuGet?
在这个堆栈溢出问题中,发布的答案是在我的asp.net项目中创建一个不需要的代码行,只是为了在部署我的asp.net应用程序时复制依赖文件:
我认为我不应该添加未使用的代码来部署依赖项。 我也不应该在我的UI项目中添加对EF的引用。
据我所知,EF文件(EntityFramework.SqlServer.dll)在运行时被注入到实体框架中。 是的 - 我的asp.net项目配置正确 - 如果它具有对EF或dll EntityFramework.SqlServer.dll的nuget引用,它运行良好。
但: 我不想在我的asp.net mvc项目中添加对实体框架的引用,只是为了部署这个文件。 我不想添加对我的DAL项目bin文件夹中的文件的引用,这个文件非常脆弱。 我可以在asp.net mvc项目中添加一个post build事件,但这似乎也很脆弱。
在MSTest项目中,我们可以添加[DeploymentItem ...]属性来部署这些类型的依赖项。在asp.net中是否有一个等价物,也许你可以把它放在web.config中。
我认为如果我可以在web.config中配置引用实体框架使用的sql提供程序:
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="v11.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
您也可以配置dll进行部署!
2/13编辑
我正在使用visual studio 2013和EF 6。
有几个人问我为什么关心,为什么我不只是使用NuGet来管理它,并使用NuGet将实体框架引用添加到我的UI项目中。
2个理由:
我的用户界面不应该知道我的ORM是什么!在我的UI项目中不应该需要项目引用。
更重要的是,我管理着一支不同技能水平的开发团队,在岸和离岸。我不希望其中一个在UI中意外使用EF类。在UI项目中引用EF可以很容易地让VS或Resharper在“使用System.Data.Entity;”中滑动。然后你就可以在你的UI项目中使用你的ORM了。
答案 0 :(得分:6)
多项目解决方案中EF配置的问题说明如下:
EntityFramework.SqlServer (or other providers) not being copied locally
它完美地解释了原因,但我找到了更好的解决方法:
我有一个UI项目和DAL项目的解决方案
要在UI项目中不引用EF dll,我已经完成了:
1)从UI项目引用中删除它
2)将后期构建事件添加到UI项目:
if $(ConfigurationName) == Debug (
copy $(SolutionDir)\DBWrapper\Bin\Debug\EntityFramework.SqlServer.dll $(SolutionDir)\IrregularVerbs\Bin\Debug\
)
else if $(ConfigurationName) == Release (
copy $(SolutionDir)\DBWrapper\Bin\Release\EntityFramework.SqlServer.dll $(SolutionDir)\IrregularVerbs\Bin\Release\
)
“(”char必须与“if”在同一行 - 否则会出现错误:
错误2命令“...”退出,代码为255。
答案 1 :(得分:0)
您使用的是哪个版本的EF?我有与你描述的相同的精确设置......基于EF5的MVC proj + EF DAL proj。我检查了两个项目的引用,它们都没有引用EntityFramework.SqlServer.dll。两者都只引用EntityFramwork.dll。
无论如何,我得到了关于引用/发布依赖关系的基本痛点。然而,与你不同,我一直满足于让NuGet做这项工作,我不介意。
我只需右键单击解决方案,然后单击“管理解决方案的NuGet包...”,然后在左窗格中选择“已安装的包”节点,滚动到“实体框架”并单击它,然后单击“管理”按钮并检查它是否适用于MVC项目和DAL项目。
答案 2 :(得分:0)
你的推理有点没有实际意义,但我可以帮助澄清一下。
如果要限制EF上下文的暴露,请通过工作单元/存储库模式公开接口。在EF实现之上创建一个抽象层,通过像Ninject或Autofac这样的DI构造注入。
无论哪种方式,开发人员不会使用您的EF上下文的唯一方法是成为纪律严明的开发人员。代码审查将有助于减轻人们愚蠢的行为。
答案 3 :(得分:0)
我遇到了同样的问题并找到了解决方案。
<connectionStrings>
<add name="PlayData" connectionString="Data Source=.\SQLExpress;Initial Catalog=PlayHarder;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>
</connectionStrings>
&#13;
有!在UI层中不再引用EF,并且网页仍将运行。通过存储库和工作单元模式在数据层中仅使用EF。
总结一下:只是不要在UI层安装或nuget-install EntityFramework,它会正常工作。
答案 4 :(得分:0)
添加此代码,让visual studio了解您在代码中使用entityframework.sqlserver。 使用EF refrence将此代码输入项目后,EveryThing将变得很好。
public abstract class dummy: DbContext
{
static dummy()
{
var dummyvariable=
System.Data.Entity.SqlServer.SqlProviderServices.Instance;
}
}