1

我正在编写一些 BLL 代码以位于实体框架之上(使用 DBContext 生成的 DAL 类,但这对于这个问题并不重要)。这是我的例行程序之一:

public static Customer Get(int32 CustID, IEnumerable<string> IncludeEntities = null)
{
}

因此,当我调用它时,我传递了一个 CustID,一个我想要包含的实体的可选列表 - 例如“Orders”和“OrderDetails”:

Customer customer = CustomerBLLRepository.Get("ALFKI", 
     new[] { "Orders", "Orders.Order_Details"});

它工作正常,但我不喜欢用字符串列表或数组来调用它——我想获得强类型,以便 IDE 可以提供帮助。

我可以通过像这样声明它来接收类型列表:

public static void GetTest(Int32 CustID, params Type[] IncludeEntities)
{
}

并获取类名作为包含工作的字符串,但是调用者必须像这样使用 typeofs:

CustomerRepository.GetTest(123, typeof(Order), typeof(OrderDetails));

这不是世界末日,但这会导致问题,因为 OrderDetails 实际上是 Orders 的导航属性,并且包含需要调用 Orders.OrderDetails,我必须让代码四处寻找哪个实体 OrderDetails在子级中并且仍然生成字符串。

我真正想要的是一个强类型的实体列表,以包含的相同格式传递,EF 希望它们作为包含,但我认为我是 SOL。

4

2 回答 2

1

假设您的 EF 模型维护了关系为什么不使用采用 Lambda 的自定义获取例程。根据您的样品,您将获得一个“客户”。

public class RepositoryCustomer: RepositoryBase<Customer> 
...
...
public class RepositoryEntityBase<T>
   public virtual T Get(Expression<Func<T, bool>> predicate)
       return Context.Set<T>.Where(predicate).FirstOrDefault();

您为上下文中的任何集合调用通用获取例程,

var aCustomer = RepositoryCustomer.Get(c=>c.id=="ALFKI" && c.Orders.OrderDetail=="bla")

虚拟导航属性非常有用且灵活。

于 2012-12-17T07:11:40.520 回答
0

确定要在查询中包含哪些实体不应该是 BLL 以外的任何任务。如果 BLL 采用一个或多个引用数据存储结构的属性,那么您说的是 BLL 需要了解数据存储的内部结构的任何调用。编辑:不够清楚。这样做是完全错误的。

IMO 您应该为每个用例创建一个单独的方法 - 否则您的 BLL 只是 DAL 的辅助方法,并且不负责关注点分离。

这是 Entity Framework 的一个主要问题 - MS 让您看起来好像应该在您喜欢的任何时候将您的查询放在一起,并在您喜欢的任何地方使用和保持实体活动。确实很难看到光。

于 2012-12-17T07:30:01.587 回答