Владельцы при обновлении efCore с 2.2 на 3.1 - PullRequest
0 голосов
/ 24 марта 2020

Я переношу существующий проект, основанный на DDD принципах разработки, с efcore 2.2 на efcore 3.1. Настройка базы данных основана на серии статей, которые июль ie Лерман написал несколько лет за go.

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

InvalidOperationException: The type 'ApplicationCore.Entities.UserAggregate.Email' cannot be configured as non-owned because an owned entity type with the same name already exists

Два объекта:

public class User
{
    public int Id { get; private set; }
    public Guid GuidId { get; private set; }
    public Email Email {get; private set;}
}

и это «принадлежащий» объект

public class Email
{
    public string Address { get; private set; }
}

Ранее в EfCore 2.2 конфигурация была:

private static void ConfigureUser(EntityTypeBuilder<User> builder)
{
    builder.HasKey(s => s.Id);

    builder.Property(s => s.GuidId)
            .IsRequired();

    builder.OwnsOne(u => u.Email);
}

Насколько я понимаю, что я должен делать в efcore3.1, это обновить это так:

private static void ConfigureUser(EntityTypeBuilder<User> builder)
{
    builder.HasKey(s => s.Id);

    builder.Property(s => s.GuidId)
            .IsRequired();

    builder.OwnsOne(u => u.Email).WithOwner();
}

Помимо этого метода настройки, есть еще несколько для другие сущности в методе OnModelCreating()

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<ForecastSetup>(ConfigureForecastSetup);
    …
    builder.Entity<User>(ConfigureUser);

    // Remove internal property
    foreach (var entityType in builder.Model.GetEntityTypes())
    {
        builder.Entity(entityType.Name).Ignore("IsDirty");
    }
}

Исключение будет выдано из строки builder.Entity(entityType.Name).Ignore("IsDirty").

И это все. Тем не менее, это делает ноль разницы, и та же ошибка появляется снова.

Я не могу запустить add-migrations, чтобы проверить, если что-то еще настраивается, поскольку генерируется исключение, и я не уверен, что будет произойдет, если я удалю ContextModelSnapshot…

1 Ответ

1 голос
/ 24 марта 2020

Спасибо @IvanStoev, см. Вопрос, на который он ссылается, в комментариях.

Конфигурация была правильной, моя проблема возникла при попытке удалить свойство Shadow

// Remove shadow property for entities which are not owned
foreach (var entityType in builder.Model.GetEntityTypes().Where(e => !e.IsOwned()))
{
    builder.Entity(entityType.Name).Ignore("IsDirty");
}
...