首页 > 解决方案 > 设计抽象类的层次结构并在 EF Core 中使用它

问题描述

我正在使用 .NET Core 和 Entity Framework Core 来构建一个金融应用程序,我想知道如何让我的设计更好。

我有两个实体之间的一对多关系,BankAccount并且Transaction. 在某种程度上:

但是,我想包括来自不同 3P 来源的银行账户和交易。虽然这种关系和主要字段在不同的来源中很常见,但每个来源都有一组我想要保留的独特属性。

为了实现这一点,我决定将这些实体定义为抽象类。这样,您只能实例化这些实体的具体版本,每个版本都来自特定的数据源。

public abstract class Transaction : BaseEntity
{
    public DataSource Source { get; private set; }
    public decimal Amount { get; private set; }
    public DateTime Date { get; private set; }
    public string Name { get; private set; }
    public BankAccount BankAccount { get; private set; }
    public Guid BankAccountId { get; private set; }
    ...
}


public abstract class BankAccount : BaseEntity
{

    public DataSource Source { get; private set; }
    public string Name { get; private set; }
    public Balance Balance { get; private set; }
    public IEnumerable<Transaction> Transactions {get; private set;}
    ...
}

这是具体实现的精简示例:

public class PlaidTransaction : Transaction
{
    public string PlaidId { get; private set; }

    private PlaidTransaction() : base() { }

    public PlaidTransaction(decimal amount, DateTime date, string name, Guid bankAccountId, string plaidId) : base( amount, date, name, bankAccountId)
    {
        PlaidId = plaidId;
    }
}

public class PlaidBankAccount : BankAccount
{
    public string PlaidId { get; private set; }
    ...
}

我正在使用 .Net Core 和 Entity Framework Core 来保存我的数据,并且我设法将我的具体类都存储在同一个表中(TPH 方法)

这很好用,现在我所有的实体都住在同一张桌子下。所以我可以使用 LINQ 的OfType<T>扩展查询所有事务或特定类型的事务。

DbSet<Transaction> entities = _context.Set<Transaction>();

IEnumerable<PlaidTransaction> plaidTransactions = entities.OfType<PlaidTransaction>();

但是,当我从具体的 Transaction 访问我的 BankAccount 字段时,我没有得到具体的实例。所以这样的事情是行不通的。

plaidTransactions.Where((t) => t.BankAccount.PlaidId)

相反,我必须投射它:

plaidTransactions.Where((t) => (t.BankAccount as PlaidBankAccount).PlaidId)

我能做些什么来避免到处施放?我觉得我的设计中缺少一个可以让我的所有代码更容易的部分。我正在考虑覆盖具体类上的 getter,但我不知道是否可以将派生类返回到基类方法。也许我应该转向泛型,但 1)我仍然想保持这些实体之间的固定关系,以及 2)EF Core 将如何处理这个问题?

标签: asp.net-coreoopinheritancedesign-patternsentity-framework-core

解决方案


推荐阅读