Выражение фильтра не может быть указано для типа объекта, поскольку оно может применяться только к корневому типу объекта в иерархии. - PullRequest
0 голосов
/ 23 мая 2018

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

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);
    }
}

DbContext:

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());
        }
    }

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

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

Я пробовал этот подход https://github.com/aspnet/EntityFrameworkCore/issues/10259, но все равно получаю больше ошибок

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

1 Ответ

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

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

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

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

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

: IdentityDbContext<AspNetUser, AspNetRole, int>

В случае, если вы создаете другие пользовательские сущности, наследующие общие IndentityXyz<> классы, посмотрите на другие базовые IdentityDbContext классы, имеющие более общие аргументы типа, и выберите одинэто позволяет вам передавать все ваши типы пользовательских идентификаторов.

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