EF Core-如何获取聚合根的关联实体?

时间:2019-08-09 12:19:12

标签: c# entity-framework ef-code-first ef-core-2.1

在我的应用中,我尝试在为一个简单的基金帐户建模时遵循DDD。

类是

FundAccount

public Guid Id { get; set; }

private ICollection<AccountTransaction> _transactions = new List<AccountTransaction>();

public IReadOnlyCollection<AccountTransaction> Transactions => _transactions
            .OrderByDescending(transaction => transaction.TransactionDateTime).ToList();

帐户交易

public Guid Id { get; set; }

public decimal Amount { get; set; )

我正在尝试从数据库中检索包含以下交易的资金帐户:

var fundAccount = await _context.FundAccounts
                 .Include(a => a.Transactions)
                 .SingleAsync(a => a.Id == ...);
  

当我检索FundAccount(数据库中有交易记录)时,Transactions的值为0 AccountTransaction

有人可以在这里看到我需要做什么吗?

1 个答案:

答案 0 :(得分:2)

首先,在实体 data 模型中使用* domain逻辑”(您不应该这样做,但这是另一回事),请确保将EF Core配置为使用backing fields属性(默认),方法是将以下内容添加到数据库上下文OnModelCreating中:

modelBuilder.UsePropertyAccessMode(PropertyAccessMode.Field);

此btw已被视为问题,将在3.0版本中修复-请参见Breaking Changes - Backing fields are used by default。但目前您必须包含以上代码。

第二,您必须更改背景字段 type 以与属性类型兼容。

在您的情况下,ICollection<AccountTransaction>IReadOnlyCollection<AccountTransaction> 不兼容,因为前者出于历史原因不会继承后者。但是List<T>(和其他集合 classes )实现了这两个接口,并且由于这是您用来初始化字段的方法,因此只需将其用作字段类型:

private List<AccountTransaction> _transactions = new List<AccountTransaction>();

完成这两个修改后,集合导航属性将由EF Core正确加载。