Выражение фильтра нельзя указать для типа сущности, поскольку оно может применяться только к корневому типу сущности в иерархии.

Я пытаюсь изменить способ, которым asp.net генерирует свои таблицы идентификаторов, пытаясь основывать генерацию на идентификаторе int вместо Guid (строка), а также добавляя другую схему (вместо dbo -> Security) и QueryFilter для все мои объекты, в этом случае я создал для каждого класса сопоставление, но проиллюстрирую идею только одним, который дает мне ошибку.

public class AspNetRole : IdentityRole<int>, IEntityBase
{
    public bool IsDeleted { get; set; }
    public string CreatedBy { get; set; }
    public string UpdatedBy { get; set; }
    public DateTime? CreatedOn { get; set; }
    public DateTime? UpdatedOn { get; set; }
}

 public interface IEntityBase
 {
    int Id { get; set; }
    bool IsDeleted { get; set; }
    string CreatedBy { get; set; }
    string UpdatedBy { get; set; }
    DateTime? CreatedOn { get; set; }
    DateTime? UpdatedOn { get; set; }
 }

Класс сопоставления с QueryFilter:

public class AspNetRoleMap : IEntityTypeConfiguration<AspNetRole>
{
    public void Configure(EntityTypeBuilder<AspNetRole> builder)
    {
        builder.ToTable(name: "AspNetRole", schema: "Security");
        builder.HasQueryFilter(app => !app.IsDeleted);
    }
}

Дбконтекст:

public class AspNetSecurityDbContext : IdentityDbContext<AspNetUser, IdentityRole<int>, int>
    {
        public AspNetSecurityDbContext(DbContextOptions<AspNetSecurityDbContext> options)
            : base(options)
        {
        }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);

            builder.ApplyConfiguration(new AspNetRoleMap());
        }
    }

После запуска миграции я получаю следующую ошибку:

Выражение фильтра «приложение => Not(app.IsDeleted)» не может быть указано для типа сущности «AspNetRole». Фильтр может применяться только к корневому типу объекта в иерархии.

Я попробовал этот подход http://github%20ef, но по-прежнему получаю больше ошибок.

builder.HasQueryFilter(app => !((IEntityBase)app).IsDeleted);


person Zinov    schedule 22.05.2018    source источник


Ответы (1)


Проблема не имеет ничего общего с фильтром запроса EF Core, кроме некорректного базового универсального аргумента IdentityDbContext. Здесь

: IdentityDbContext<AspNetUser, IdentityRole<int>, int>

вы передаете IdentityRole<int>, который в базе OnModelCreating будет настроен как сущность, поэтому EF Core сопоставит вашу сущность AspNetRole с помощью Стратегия наследования TPH, которая наряду с дополнительным столбцом дискриминатора вводит дополнительные ограничения, такие как исключение фильтра запроса, которое вы получаете.

Чтобы исправить это, передайте правильный аргумент универсального типа, который в данном случае является пользовательским классом AspNetRole:

: IdentityDbContext<AspNetUser, AspNetRole, int>

Если вы создаете другие пользовательские объекты, наследующие общие классы IndentityXyz<>, взгляните на другие базовые классы IdentityDbContext, имеющие более общие аргументы типа, и выберите тот, который позволяет вам передавать все ваши пользовательские типы, производные от удостоверений.

person Ivan Stoev    schedule 23.05.2018