Как предотвратить обновление столбца в EF Core 3.1?

Я обновил.Net Core 2.2 до 3.1, и эта функция устарела.

modelBuilder
.Entity<Order>()
.Property(e => e.CreationTime)
.ValueGeneratedOnAddOrUpdate()
.Metadata.IsStoreGeneratedAlways = true;

Мне нужен EF для вставки, но заблокировать обновление.

Благодарность!

2 ответа

Решение

Согласно Снятые с имуществом реализации:

public virtual bool IsStoreGeneratedAlways
{
    get => AfterSaveBehavior == PropertySaveBehavior.Ignore || BeforeSaveBehavior == PropertySaveBehavior.Ignore;
    set
    {
        if (value)
        {
            BeforeSaveBehavior = PropertySaveBehavior.Ignore;
            AfterSaveBehavior = PropertySaveBehavior.Ignore;
        }
        else
        {
            BeforeSaveBehavior = PropertySaveBehavior.Save;
            AfterSaveBehavior = PropertySaveBehavior.Save;
        }
    }
}

эквивалентный код должен установить BeforeSaveBehavior а также AfterSaveBehavior к Ignore.

Также с BeforeSaveBehavior а также AfterSaveBehavior свойства были заменены на Get / Set пары методов, потребуется ввести временную переменную для хранения метаданных свойства.

Что-то вроде этого:

var creationTime = modelBuilder
    .Entity<Order>()
    .Property(e => e.CreationTime)
    .ValueGeneratedOnAddOrUpdate()
    .Metadata;
creationTime.SetBeforeSaveBehavior(PropertySaveBehavior.Ignore);
creationTime.SetAfterSaveBehavior(PropertySaveBehavior.Ignore);

Согласно официальной документации, IsStoreGeneratedAlways устаревает с версии 3.1.

Сборка Microsoft.EntityFrameworkCore.Metadata:

Если Throw, то будет сгенерировано исключение, если этому свойству будет присвоено новое значение после того, как объект существует в базе данных.

Если "Игнорировать", то любое изменение значения свойства сущности, которая уже существует в базе данных, будет проигнорировано.

Вам следует попробовать что-то вроде этого:

modelBuilder
    .Entity<Order>()
    .Property(e =>.CreationTime).Metadata.SetAfterSaveBehavior(PropertySaveBehavior.Ignore);
Другие вопросы по тегам