asp.net-core - 设计抽象类的层次结构并在 EF Core 中使用它
问题描述
我正在使用 .NET Core 和 Entity Framework Core 来构建一个金融应用程序,我想知道如何让我的设计更好。
我有两个实体之间的一对多关系,BankAccount
并且Transaction
. 在某种程度上:
- 1个账户可以有很多交易
- 1 笔交易属于 1 个账户
但是,我想包括来自不同 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 将如何处理这个问题?
解决方案
推荐阅读
- javascript - 无法获取子元素的 href 值
- excel - while循环中的多个条件不起作用
- azure-hdinsight - 具有单个 ADLS gen2 存储的多个 HDInsight 群集
- java - Hikari 连接池没有增加
- python - 如何在 Python 中为 POST 请求传递一个查询参数?
- html - Angular 8 中使用 ngFor 的多级下拉菜单
- qt - 无法自动化windeployqt,未找到
- sql - 如何将值插入列并同时引用 Oracle 表中该列的前一个值?
- minio - 迷你吧。我无法运行 minio 集群。在从节点上收到此错误
- python - 如何在网页中基于十六进制字符串模式抓取数据