我有一个类似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;
}
我有流利的API映射的多对多关系。
我的问题是处理
DishCategory
表的最佳实践是什么?我是否应该创建单独的存储库来处理此问题,导致从
Dish
或Category
端进行处理,感觉不对?
处理DishCategory表的最佳实践是什么?
它们应该在同一个存储库中。而且您的ApplicationDbContext
是一个非常好的存储库。首先,没有理由将其包装在单独的存储库类中。
如果走那条路,您将不断在存储库中添加和更改方法,以在应用程序中实现业务逻辑,并且存储库将最终充满属于存储库外部的代码,例如查询和事务。
如果要使用单个实体存储库,则应该[[至少有一种方法可以访问DbContext来访问其他实体。这是一个简单的单实体接口的想法,该接口使用C#8的新默认接口实现。
public interface IRepository<T> where T:class
{
public DbSet<T> Set
{
get
{
var db = (DbContext)this;
return db.Set<T>();
}
}
public T Find(int id)
{
return Set.Find(id);
}
//. . .
}