2016-08-17 135 views
0

我正在使用EF进行数据访问的WCF服务应用程序。 DataLayer下的所有EF模型。我已经在数据层WCF服务与EntityFramework,给出错误“类型'DBContext'是在未引用的程序集中定义的”

namespace TRA.Services.DataAccessLayer 
{ 
    public static class DataObjectFactory 
    { 
     public static TRAEntities CreateTRAContext() 
     { 
      return new TRAEntities(); 
     } 
    } 
} 

创建以下的工厂方法在业务层,我尝试使用下面的代码:

using (var context = DataObjectFactory.CreateTRAContext()) 
      { 
       var objClients = from r in context.TRAEmployee 
           orderby r.id 
           select r; 
      } 

它给了我以下错误: “类型‘的DbContext’是定义在未引用的程序集中您必须添加对程序集“EntityFramework,Version = 6.0.0.0,......”的引用“

Sinc e我在业务层中使用此代码我不想添加对EntityFramework的引用。

有什么办法来处理这种情况?

+0

没有,必须添加参考。这实际上不应该打扰你,因为包含WCF服务的项目通常是层次结构中最重要的项目。 –

+0

@Wiktor OP正在讨论业务层,它通常是一个单独的程序集,仅仅由WCF服务层负责和调用。 – CodeCaster

回答

1

如果您希望使用该成员,则必须知道在程序集中公开从类成员公开的类型的继承树中的每种类型(public static TRAEntities,其中TRAEntities : DbContext)。

因此,因为您要从业务层公开并访问DataObjectFactory.CreateTRAContext(),并且从该方法返回的类型继承自实体框架的DbContext,您的业务层需要对实体框架的引用。

您可以通过引入一个间接层来解决这个问题,在这种情况下通常通过一些存储库层完成。这也使您的业务层可测试,而不必嘲笑实体框架。的

因此,而不是从你的数据层在DbContext拉动和访问其DbSet<T>会员,你暴露库这反过来又会使您要访问的实体:

public interface IRepository<T> 
{ 
    IQueryable<T> Entries(); 
} 

这个仓库的实施是内部数据层,并包装DbSet<T> DbContext.Set<T>

+0

你可以给任何文章的链接给出一步一步实施这种方法? –

+0

在Entity Framework中使用存储库模式(或为什么不这样做)在Web上被非常全面地记录下来,我不能推荐一个站点。请尝试搜索。 – CodeCaster

0

这里的问题更多的是概念性。 反而暴露,返回的TRAEntities实例的方法,你应该建立一个Accessor,返回员工列表中bsuness逻辑层,如:

IEnumerable<Employee> GetEmployees() 
{ 
    IEnumerable<Employee> employees; 

    using (var context = DataObjectFactory.CreateTRAContext()) 
    { 
     employees = from r in context.TRAEmployee 
        orderby r.id 
        select r; 
    } 

    return employees; 
} 

此外,如果层之间的抽象是非常重要的,实现单独的Employee实体,用于将数据移出数据访问层。

相关问题