Исключить свойство из SELECT, но включить в INSERT и UPDATE в Entity Framework CoreC#

Место общения программистов C#
Ответить
Anonymous
 Исключить свойство из SELECT, но включить в INSERT и UPDATE в Entity Framework Core

Сообщение Anonymous »

В Entity Framework Core у меня есть класс сущности со свойством, которое я хочу исключить из операций SELECT, но все же включить во время INSERT и UPDATE. Класс сущности нельзя изменить, поэтому я не могу добавлять вспомогательные поля или вносить изменения в сам класс. Как я могу настроить игнорирование этого свойства при запросе данных, но при этом разрешить его установку и обновление при сохранении изменений?
Класс сущности выглядит следующим образом:

Код: Выделить всё

public class MyEntity
{
public int Id { get; set; }
public string MyProperty { get; set; }
}
Мне нужно, чтобы MyProperty опускался, когда объект загружается из базы данных, но все равно включался в операции INSERT и UPDATE.
Обратите внимание, что я не могу используйте такое решение:

Код: Выделить всё

var myEntities = context.Set()
.Select(e => new MyEntity
{
Id = e.Id,
// Exclude MyProperty
});
потому что я заранее не знаю точную сущность и свойство. Эта пользовательская конфигурация необходима для замены старой собственной ORM, в которой использовался пользовательский атрибут [WriteOnly]
Для старых атрибутов ORM [ReadOnly] я успешно доработал логику следующим образом:

Код: Выделить всё

propertyBuilder.Metadata.SetBeforeSaveBehavior(PropertySaveBehavior.Ignore); // Avoids inserting the property
propertyBuilder.Metadata.SetAfterSaveBehavior(PropertySaveBehavior.Ignore); // Avoids updating the property
Я решил проигнорировать свойство в OnModelCreating:

Код: Выделить всё

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity()
.Ignore(e => e.MyProperty);
}
и переопределение метода SaveChanges для принудительного изменения свойства:

Код: Выделить всё

public override int SaveChanges()
{
foreach (var entry in ChangeTracker.Entries())
{
if (entry.State == EntityState.Added || entry.State == EntityState.Modified)
{
entry.Property(nameof(MyEntity.MyProperty)).IsModified = true;
}
}

return base.SaveChanges();
}
Это эффективно предотвращает материализацию свойства во время SELECT, но строка write.Property(nameof(MyEntity.MyProperty)).IsModified = true; не может работать как свойство MyProperty больше не является частью модели

Подробнее здесь: https://stackoverflow.com/questions/790 ... y-framewor
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»