2013-11-21 24 views
1

问题
- 应用程序是否真的需要安装EF6来使用另一个使用EF6的类库,因为它的底层数据检索机制(或者我错了)?
- 我如何解决这个问题,仍然使用EF?我必须在所有项目中引用Entity Framework 6 dll吗? (不仅仅是我的DAL)

方案
我们正在与使用EF6得到它的数据的新版本重写旧DAL。消费者应用程序不会在EF上下文中调用。他们改为调用中间函数(在DAL项目的业务逻辑文件夹中),然后调用EF。

当我有一个消费应用程序中引用我的新DAL(连接字符串和供应商引用添加到它的.config),编译缺少提供商的抱怨:

没有实体框架提供发现的ADO。具有不变名称'System.Data.SqlClient'的.NET提供程序。

我可以通过在我的使用应用程序中安装EF6软件包来解决这个问题,但这是有问题的。我们有大量的消费应用程序,其中很多具有​​并行数据访问机制,通常包含旧版本的EF。我需要我的DAL独立于我的消费者。

可以这样做吗?

+0

无17小时内回复让我感到紧张,我问了一个错误的问题。 我现在知道我可以将EF dll添加到我的使用应用程序中,并且它毫不费力地工作,但为什么应用程序不会使用类库(DAL)中提供的提供程序,而不是要求它们在每个应用程序中,每一个消费应用?特别是当消费应用程序没有提供时。 – maulkye

+0

我退出到EF5并没有发生这个问题。尽管我的原始问题并不是真正的答案。 – maulkye

回答

0

从EF4迁移到EF6时,我遇到了同样的问题。将EntityFramework.SqlServer.dll作为您的DAL库的参考,可解决DAL连接的问题,但不解决消费应用程序的问题。

发生该问题是因为此dll只能通过反射使用,并且因为它在编译时不是必需的,所以不会在使用应用程序中发布。黑客的解决办法是做一个无用的参考只是为了强制dll被复制。

就像是:

public class MyAppContext : DbContext 
{ 
    public MyAppContext() 
    { 
     // hack to force the EntityFramework.SqlServer.dll to be copied when another project references this one 
     var forceDllCopy = System.Data.Entity.SqlServer.SqlProviderServices; 
    } 
} 
0

添加下面的类访问你的数据项目,该项目引用的EntityFramework

[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] 
public class ReferenceTypeAttribute : Attribute 
{ 
    private readonly Type _type; 

    public ReferenceTypeAttribute(Type type) 
    { 
     _type = type; 
    } 
} 

然后添加到项目下一行的AssemblyInfo.cs

[assembly: ReferenceType(typeof(System.Data.Entity.SqlServer.SqlProviderServices))] 
相关问题