Основные пользовательские соглашения EF и прокси - PullRequest
0 голосов
/ 31 мая 2018

Я создаю пользовательское IEntityTypeAddedConvention в ef-core 2.1 и включаю LazyLoadingProxies, вызывая метод UseLazyLoadingProxies.Мое пользовательское соглашение - это класс для добавления составного ключа к модели, как показано ниже:

public class CompositeKeyConvetion : IEntityTypeAddedConvention
{
    public InternalEntityTypeBuilder Apply(InternalEntityTypeBuilder entityTypeBuilder)
    {
        Check.NotNull(entityTypeBuilder, nameof(entityTypeBuilder));

        if (entityTypeBuilder.Metadata.HasClrType())
        {
            var pks = entityTypeBuilder
                .Metadata
                .ClrType
                .GetProperties(BindingFlags.Public | BindingFlags.Instance)
                .Where(p => p.IsDefined(typeof(CompositeKeyAttribute), false))
                .ToList();

            if (pks.Count > 0)
            {
                entityTypeBuilder.PrimaryKey(pks, ConfigurationSource.Convention);
            }
        }

        return entityTypeBuilder;
    }
}

Все работает отлично, но иногда я получаю сообщение об ошибке:

Ключ не может быть настроен наPermitPublicationProxy, потому что это производный тип.Ключ должен быть настроен для корневого типа PermitPublication.Если вы не предполагали, что PermitPublication будет включен в модель, убедитесь, что он не включен в свойство DbSet вашего контекста, не указан в вызове конфигурации для ModelBuilder или не указан в свойстве навигации для включенного типав модели.Если LazyLoadingProxy отключен, ошибка не отображается.

1 Ответ

0 голосов
/ 31 мая 2018

Как указывает сообщение об ошибке, PK не может быть сконфигурирован для производного типа (который может быть из сопоставления стратегии наследования сущностей, и, очевидно, теперь также является типом прокси, хотя последний может быть ошибкой).

Что в терминах EF Core (а также исходного кода внутреннего EF Core KeyAttributeConvention ) означает применимые критерии, такие как EntityType.BaseType == null.

Так что все, что вам нужно, это изменить ifкритерии следующие:

if (entityTypeBuilder.Metadata.HasClrType() && entityTypeBuilder.Metadata.BaseType == null)
...