为什么我必须在我的UI项目中引用EF?

时间:2014-02-13 05:48:55

标签: asp.net asp.net-mvc entity-framework

使用您的asp.net项目部署的UI项目(特别是EF:EntityFramework.SqlServer.dll的sql服务器驱动程序)部署实体框架是否有更优雅的方式,而不是通过添加对EF的引用您的UI项目中的NuGet?

在这个堆栈溢出问题中,发布的答案是在我的asp.net项目中创建一个不需要的代码行,只是为了在部署我的asp.net应用程序时复制依赖文件:

stack overflow article

我认为我不应该添加未使用的代码来部署依赖项。 我也不应该在我的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个理由:

  1. 我的用户界面不应该知道我的ORM是什么!在我的UI项目中不应该需要项目引用。

  2. 更重要的是,我管理着一支不同技能水平的开发团队,在岸和离岸。我不希望其中一个在UI中意外使用EF类。在UI项目中引用EF可以很容易地让VS或Resharper在“使用System.Data.Entity;”中滑动。然后你就可以在你的UI项目中使用你的ORM了。

5 个答案:

答案 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)

我遇到了同样的问题并找到了解决方案。

  1. 删除UI图层中的EF引用。
  2. 删除web.config中的EF引用
  3. 只需确保定义连接字符串
  4. 即可

    &#13;
    &#13;
      <connectionStrings>
        <add name="PlayData" connectionString="Data Source=.\SQLExpress;Initial Catalog=PlayHarder;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>
      </connectionStrings>  
    &#13;
    &#13;
    &#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;
     }
}