EF Core 2.2 вложенные коллекции собственных типов - PullRequest
0 голосов
/ 02 ноября 2019

Сначала я использую код EF Core 2.2 для описания доменной модели, следуя принципам DDD. Я реализовал концепцию объектов-значений, используя (успешно) принадлежащие типы сущностей, как в скалярной, так и в установочной коллекции.

У меня есть необходимость использовать вложенные принадлежащие типы, где верхний уровень - это принадлежащая скаляру сущность (значениеobject), а inner - это коллекция принадлежащих сущностей.

Сущность-владелец (совокупный корень):

public class Delivery : BaseEntity, IAggregateRoot
{
    public DeliveryService DeliveryService { get; set; }
}

Тип сущности, принадлежащей верхнему уровню (объект значения)

public class DeliveryService : ValueObject
{
    public ICollection<DeliveryServicePricing> Pricings { get; set; }
}

Вложенные типы принадлежащих сущностей (набор объектов значений)

public class DeliveryServicePricing : ValueObject
{
    public decimal SellingPrice { get; set; }
    public ICollection<DeliveryServiceUnitCost> UnitCosts { get; set; 
}

Конфигурация типа сущности владельца

public class DeliveryConfiguration : IEntityTypeConfiguration<Delivery>
{
    public void Configure(EntityTypeBuilder<Delivery> builder)
    {
        builder.OwnsOne(d => d.DeliveryService, ob =>
            {
                ob.ToTable("DeliveryServices");
                ob.OwnsMany(ds => ds.Pricings, ob1 => 
                {
                    ob1.ToTable("Pricings");
                    ob1.HasForeignKey("DeliveryServiceId");

                    // shadow property useful to compose a key
                    ob1.Property<decimal>("SellingPrice");
                    ob1.HasKey("DeliveryServiceId", "SellingPrice");
                });
            });
    }
}

Когда я запускаю этот код для вставки новых сущностей, после сохраненияизменения Я получаю эту ошибку:

Сообщение: System.AggregateException: произошла одна или несколько ошибок. (Отношение «DeliveryServiceUnitCost» к «DeliveryServicePricing.DeliveryServiceUnitCosts» не поддерживается, поскольку тип принадлежащего объекта «DeliveryServicePricing» не может быть на главной стороне отношения, не принадлежащего владельцу). (Следующие параметры конструктора не имели соответствующих данных фикстуры:DbContextQueriesFixture fixture) ---- System.InvalidOperationException: отношение от «DeliveryServiceUnitCost» к «DeliveryServicePricing.DeliveryServiceUnitCosts» не поддерживается, поскольку принадлежащий объекту типа «DeliveryServicePricing» не может быть на основной стороне отношения, не являющегося собственником. ---- Следующие параметры конструктора не имеют соответствующих данных фикстуры: DbContextQueriesFixture fixture

В официальной документации Microsoft говорится о том, что вложенные типы должны быть зависимыми, а не основными:

В дополнение к вложенным принадлежащим типам, принадлежащий тип может ссылаться на обычную сущность, это может быть либо владелец, либо другая сущность, если принадлежащая сущность находится на зависимой стороне. Эта возможность устанавливает собственные типы объектов в EF6 отдельно.

... но они говорят о связанных объектах (HasOne / Many), а не о собственных объектах (OwnsOne / Many).

Так что я больше не уверен, что комбинация вложений OwnsOne / OwnMany действительно возможна. Любое подтверждение об этом?

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