在我的应用中,我尝试在为一个简单的基金帐户建模时遵循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
的值为0AccountTransaction
?
有人可以在这里看到我需要做什么吗?
答案 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正确加载。