实体框架无法在实体构造函数中绑定值对象

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)

之后,一切都按预期进行,数据库成功更新。

  • 这会起作用,但你违背了防御性编程的要点。 (3认同)

Iva*_*oev 6

使用 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为拥有的实体类型。

  • 感谢您的建议,我提出了[文档更新](https://github.com/dotnet/EntityFramework.Docs/issues/3723)请求。请不要低估你的英语,它非常棒。我希望掌握其他语言。 (2认同)