【发布时间】:2020-04-08 02:20:38
【问题描述】:
我有一个看起来像这样的 Dish 和 Category 表:
public class Dish {
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public decimal Price { get; set; }
public string Description { get; set; }
public ICollection<UserDish> UserDishes { get; set; }
public ICollection<DishCategory> DishCategories { get; set; }
}
public class Category {
public int Id { get; set; }
[Required]
public string Name { get; set; }
public ICollection<DishCategory> DishCategories { get; set; }
}
我有每个接口和实现
public class EFDishRepository : IDishRepository {
private ApplicationDbContext _context;
public EFDishRepository(ApplicationDbContext ctx) {
_context = ctx;
}
public IQueryable<Dish> Dishes => _context.Dishes;
}
public class EFCategoryRepository : ICategoryRepository {
private readonly ApplicationDbContext _context;
public EFCategoryRepository(ApplicationDbContext ctx) {
_context = ctx;
}
public IQueryable<Category> Categories => _context.Categories;
}
我有一个由 fluent API 映射的多对多关系。
我的问题是处理DishCategory 表的最佳做法是什么?
我是否应该创建单独的存储库来处理它,因为从Dish 或Category 方面处理它感觉不对?
【问题讨论】:
-
这里是回购模式的小指南 -> programmingwithmosh.com/net/… 。返回 IQueryable 通常是“不好的” 做法。还有什么对你有意义?如果这是您所要求的,那么在一个存储库中拥有 2 个域并没有错。确保让 repo 的消费者知道这一点,因为这是一个更昂贵的查询。
-
@panoskarajohn 我应该改为使用不同的方法在存储库中进行所有过滤吗?我在问拥有一个加入表存储库是否合适,因为我在任何地方都找不到示例
-
在你的 repo 中加入表格是可以的。我通常为过滤做的是将
filter of type Expression<Func<MyClass,bool>>作为参数并让它处理我在回购中的所有过滤。另外,对于您的回购,请确保您有单独的方法。对于您的示例,将所有dishes with categories发送给我是有意义的。我将在我的 DishRepo 中使用两种方法,一种称为GetAllDishes,另一种称为GetAllDishesWithCategories,我会将过滤器Expression<Func<Dish,bool>>传递给两者。这有意义吗? -
我真的很喜欢这个 -> albahari.com/nutshell/predicatebuilder.aspx。它显示了 LinqKit(您不必使用它)。它展示了表达式树如何与 Linq 一起使用。
-
另外,如果您对自己的代码仍有疑问 -> codereview.stackexchange.com 您可以获得代码审查。
标签: c# entity-framework .net-core repository-pattern