使用实体框架的WCF服务,给出错误类型'在未引用的程序集中定义

本文关键字:引用 程序 定义 集中 程序集 错误 WCF 框架 实体 服务 出错 | 更新日期: 2023-09-27 18:02:55

我正在开发一个使用EF进行数据访问的WCF服务应用程序。我所有的EF模型在DataLayer。我在数据层

下创建了以下工厂方法
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,......"的引用"

由于我在业务层使用此代码,我不想添加对EntityFramework的引用。

有没有办法处理这种情况?

使用实体框架的WCF服务,给出错误类型'在未引用的程序集中定义

从程序集中的类成员公开暴露的类型继承树中的每个类型(public static TRAEntities,其中TRAEntities : DbContext)如果想要使用该成员,必须知道引用程序集。

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

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

因此,不是从数据层拉入DbContext并访问其DbSet<T>成员,而是暴露存储库,从而暴露您想要访问的实体:

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

这个存储库的实现在数据层内部,并包装了一个DbSet<T> DbContext.Set<T> .

这里的问题更多是概念性的。您不应该公开返回TRAEntities实例的方法,而应该创建一个将雇员列表返回给业务逻辑层的Accessor,例如:

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实体,用于将数据移出数据访问层。