ef основные типы с индексом с фильтром - PullRequest
0 голосов
/ 13 октября 2019

У меня есть следующая конфигурация объекта:

public class AgentConfiguration : IEntityTypeConfiguration<AgentEntity>
{
    public void Configure(EntityTypeBuilder<AgentEntity> builder)
    {
        builder.Property(x=> x.AgentId)
            .ValueGeneratedOnAdd();
        builder.HasKey(x => x.AgentId);

        builder.HasDiscriminator(x => x.ObjectType)
            .HasValue<AgentEntity>(EntityObjectType.Agent)
            .HasValue<GroupEntity>(EntityObjectType.Group);

        builder.Property(e => e.Name)
            .HasMaxLength(100);

        builder.Property(e => e.Mbox)
            .HasMaxLength(128)
            .HasColumnName("Mbox");

        builder.Property(e => e.Mbox_SHA1SUM)
            .HasMaxLength(40)
            .HasColumnName("Mbox_SHA1SUM");

        builder.Property(e => e.OpenId)
           .HasColumnName("OpenId");

        builder.OwnsOne(x => x.Account, accountBuilder => { 
            accountBuilder.Property(e => e.HomePage)
                .HasColumnName("Account_HomePage")
                .HasMaxLength(Constants.MAX_URL_LENGTH);

            accountBuilder.Property(e => e.Name)
                .HasColumnName("Account_Name")
                .HasMaxLength(40);
        });

        builder
            .HasIndex(x => new { x.ObjectType, x.Mbox })
            .HasFilter("[Mbox] IS NOT NULL")
            .IsUnique();

        builder
            .HasIndex(x => new { x.ObjectType, x.Mbox_SHA1SUM })
            .HasFilter("[Mbox_SHA1SUM] IS NOT NULL")
            .IsUnique();

        builder
            .HasIndex(x => new { x.ObjectType, x.OpenId })
            .HasFilter("[OpenId] IS NOT NULL")
            .IsUnique();

        builder
            .HasIndex("ObjectType", "Account_Name", "Account_HomePage")
            .HasFilter("[Account_Name] IS NOT NULL AND [Account_HomePage] IS NOT NULL")
            .IsUnique();
    }
}

Ниже приведена строка, в которой мне сложно настроить, как следует применить фильтр к собственному типу: Account

     builder.HasIndex("ObjectType", "Account.Name", "Account.HomePage")
            .HasFilter("[Account_Name] IS NOT NULL AND [Account_HomePage] IS NOT NULL")
            .IsUnique() 

Эта строка не работает, так как у родительского объекта нет свойств с именами: Account.Name или Account.HomePage

Я также попробовал следующее:

     builder.HasIndex(new { x.ObjectType, x.Account.Name, x.Account.HomePage})
            .HasFilter("[Account_Name] IS NOT NULL AND [Account_HomePage] IS NOT NULL")
            .IsUnique() 

Но это тоже не работает, я получаю следующий вывод:

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
 ---> System.InvalidOperationException: The property 'Account.Name' cannot be added to the type 'AgentEntity' because there was no property type specified and there is no corresponding CLR property or field. To add a shadow state property the property type must be specified.

Я мог бы в итоге получить конфигурацию, в которой Аккаунт живет в новой таблице. Но я бы хотел сделать следующую работу. Любая помощь очень ценится!

...