EFCore 3.1 Добавление свойств тени по умолчанию и использование их для мягкого удаления - PullRequest
1 голос
/ 15 февраля 2020

Я разрабатываю приложение с C#. NET Core 3.1 и EFCore. На основании этого документа я попытался добавить новый столбец и использовать Queryfilter.

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

            modelBuilder.ApplyConfiguration(new UserEntityTypeConfiguration());
            ....
            //Other configurations
            ...

            // Assures consistent naming and configuration of audit fields.
            foreach (IMutableEntityType entityType in modelBuilder.Model.GetEntityTypes().Where(item => !item.IsOwned()))
            {
                //Settings related to softdelete
                modelBuilder.Entity(entityType.Name).Property<bool>(nameof(DefaultColumnName.IsDeleted)).HasDefaultValue(false);
                var IsDeletedProperty = entityType.FindProperty(nameof(DefaultColumnName.IsDeleted));
                if (IsDeletedProperty != null && IsDeletedProperty.ClrType == typeof(bool))
                {
                    var parameter = Expression.Parameter(entityType.ClrType, "p");
                    var prop = Expression.Property(parameter, IsDeletedProperty.PropertyInfo);
                    var filter = Expression.Lambda(Expression.Not(prop), parameter);
                    MutableEntityTypeExtensions.SetQueryFilter(entityType, filter);
                }
            }

Однако, когда я выполняю миграцию с dotnet ef migrations add Init, появляется следующая ошибка, которая не может быть перенесена должным образом.

Value cannot be null. (Parameter 'property')

Согласно моему исследованию, эта ошибка возникает в этой строке, но я не знаю, как исправить проблему.

var prop = Expression.Property(parameter, IsDeletedProperty.PropertyInfo);

Может кто-нибудь сказать мне, как решить проблему

1 Ответ

1 голос
/ 16 февраля 2020

Свойства теней не являются реальными свойствами класса, поэтому не имеют связанных PropertyInfo или FieldInfo. Как описано в Доступ к свойствам теней :

  1. Значения свойств теней можно получить и изменить с помощью ChangeTracker API
  2. На свойства теней можно ссылаться в запросах LINQ с использованием метода EF.Property stati c

Второе относится и к выражениям фильтра. Поэтому вам нужен метод доступа к свойствам, такой как

EF.Property<bool>(p, "IsDeleted")

, что для вашего кода означает изменение рассматриваемой строки следующим образом

var prop = Expression.Call(
    typeof(EF), nameof(EF.Property), new[] { typeof(bool) },
    parameter, Expression.Constant(IsDeletedProperty.Name));
...