【问题标题】:Multiple Entities with same properties repository pattern具有相同属性存储库模式的多个实体
【发布时间】:2018-10-06 22:43:48
【问题描述】:

我有一个通用的 UOW 存储库模式。我需要添加一些具有相同属性但名称彼此不同的实体。是否有任何最简单的方法来访问存储库,而不必分别实例化每个实体存储库。

这里是实体结构的示例代码。

    public int Id  { get; set; }
    public string UserId { get; set; }
    public int ProductId { get; set; }
    public int OrderedQuantity { get; set; }
    public int FreeQuantity { get; set; }
    public double TotalPrice { get; set; }
    public double DiscountOffered { get; set; }
    public double TotalBilled { get; set; }

实体可以像 AbcProduct / XyzProduct / MnoProduct 等。它们将是此类产品的大约 10-12 个不同实体,不能保存在具有 CategoryId 的单个表下。这些表将经常在数据库中多次使用和更新,这就是我们希望采用这种方法的原因。

提前感谢您的帮助。

【问题讨论】:

  • 不,我知道继承方法,但根据我的要求,它不会这样做,因为我将在没有任何父实体的情况下单独处理每个实体。

标签: c# asp.net-mvc repository-pattern unit-of-work


【解决方案1】:

您可以让它们共享一个通用界面。

public interface IProduct
{
    public int Id  { get; set; }
    public string UserId { get; set; }
    public int ProductId { get; set; }
    public int OrderedQuantity { get; set; }
    public int FreeQuantity { get; set; }
    public double TotalPrice { get; set; }
    public double DiscountOffered { get; set; }
    public double TotalBilled { get; set; }
}

只要AbcProductXyzProductMnoProduct 实现了该接口,您就可以使用该接口类型的通用存储库

GenericRepository<IProduct> genericRepository;

var abcProduct = new AbcProduct();
var xyzProduct = new XyzProduct();
var mnoProduct = new MnoProduct();

genericRepository.Add(abcProduct);
genericRepository.Add(xyzProduct);
genericRepository.Add(mnoProduct);

【讨论】:

  • 是否映射到数据库中自己的每个表?
  • 这取决于GenericRepository 的确切实现以及实体如何映射到表。如果您使用的是 EntityFramework,您可以使用数据注释 (TableAttribute) 或流式 API (modelBuilder.Entity&lt;T&gt;().ToTable) 为每个具体类指定表。
【解决方案2】:

当然你可以使用继承。使用抽象类作为基类。

public abstract class Product
{
    public abstract int Id  { get; set; }
    public abstract string UserId { get; set; }
    public abstract int ProductId { get; set; }
    public abstract int OrderedQuantity { get; set; }
    public abstract int FreeQuantity { get; set; }
    public abstract double TotalPrice { get; set; }
    public abstract double DiscountOffered { get; set; }
    public abstract double TotalBilled { get; set; }
}

然后衍生出其他产品

public class abcProduct:Product
{
    public override int Id  { get; set; }
    ...
}

【讨论】:

    猜你喜欢
    • 2018-07-18
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    相关资源
    最近更新 更多