使用实体框架的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的引用。
有没有办法处理这种情况?
从程序集中的类成员公开暴露的类型继承树中的每个类型(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实体,用于将数据移出数据访问层。