Entity Framework не может связать объект значения в конструкторе сущностей - PullRequest
0 голосов
/ 18 апреля 2019

Я создал сущность, которая принимает объект-значение в качестве параметра в своем конструкторе, однако, когда я добавляю эту сущность в контекст БД, она выдает следующее исключение.

InvalidOperationException: не найдено подходящего конструктора для типа сущности> 'BasketItem'. Следующие конструкторы имели параметры, которые не могли быть> привязаны к свойствам типа сущности: невозможно связать 'price' в> 'BasketItem (идентификатор Guid, идентификатор продукта Guid, DateTimeOffset AddedAt, цена Money)'.

Я пробовал builder.OwnsOne(x => x.Price); в конфигурации типа. Имейте в виду, что я использую провайдера хранения в памяти.

BasketItem.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;
    }
}

Money.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 };
    }
}

1 Ответ

2 голосов
/ 18 апреля 2019

Реализация объектов DDD значений с EF Core типами объектов, принадлежащих , имеет несколько недостатков, вызванных тем, что типы объектов, принадлежащих 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;
}

И, конечно, используйте атрибут [Owned] или OwnsOne свободный API для сопоставления Money как принадлежащего типу сущности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...