Jak*_*eAM 4 c# entity-framework-core
我创建了一个实体,该实体在其构造函数中将值对象作为参数,但是当我将实体添加到 db 上下文时,它会引发以下异常。
InvalidOperationException: 找不到适合实体类型 >'BasketItem' 的构造函数。以下构造函数的参数无法>绑定到实体类型的属性:无法在>'BasketItem(Guid id, Guid productId, DateTimeOffset addedAt, Money price)'中绑定'price'。
我builder.OwnsOne(x => x.Price);在类型配置中尝试过。请记住,我正在使用内存存储提供程序。
篮子项目.cs
public sealed class BasketItem : Entity
{
public Guid ProductId { get; private set; }
public DateTimeOffset AddedAt { get; private set; }
public Money Price { get; private set; }
public BasketItem(Guid id, Guid productId, DateTimeOffset addedAt, Money price) : base(id)
{
ProductId = productId;
AddedAt = addedAt;
Price = price;
}
}
Run Code Online (Sandbox Code Playgroud)
钱.cs
public sealed class Money : ValueObject
{
public decimal Value { get; private set; }
public string CurrencyCode { get; private set; }
public Money(decimal value, string currencyCode)
{
Value = value;
CurrencyCode = currencyCode;
}
protected override IEnumerable<object> GetAtomicValues()
{
return new object[] { Value, CurrencyCode };
}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
不确定这是否仍然相关,我今天在 EF 上遇到了类似的问题。
真正帮助我的是向我的类添加一个空的构造函数**:
public MyClass()
{}
Run Code Online (Sandbox Code Playgroud)
之后,一切都按预期进行,数据库成功更新。
使用 EF Core拥有的实体类型实现 DDD值对象有几个缺点,因为 EF Core 拥有的实体类型仍被视为实体,而返回拥有的实体类型的属性被视为导航属性。
在这种特殊情况下,问题是由上述最后一件事情以及以下实体类型构造函数限制引起的
一些注意事项:
- EF Core 无法使用构造函数设置导航属性(例如上面的博客或帖子)。
解决方法/解决方案是提供 EF 使用的特殊私有构造函数:
public BasketItem(Guid id, Guid productId, DateTimeOffset addedAt, Money price) : this(id, productId, addedAt)
{
Price = price;
}
/// <summary>
/// EF constructor
/// </summary>
private BasketItem(Guid id, Guid productId, DateTimeOffset addedAt) : base(id)
{
ProductId = productId;
AddedAt = addedAt;
}
Run Code Online (Sandbox Code Playgroud)
当然,使用[Owned]属性或OwnsOnefluent API 来映射Money为拥有的实体类型。
| 归档时间: |
|
| 查看次数: |
2389 次 |
| 最近记录: |