Как предотвратить обновление столбца в EF Core 3.1? - PullRequest
1 голос
/ 30 января 2020

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

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

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

Спасибо!

Ответы [ 2 ]

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

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

Microsoft.EntityFrameworkCore.Metadata Assembly:

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

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

Вы должны попробовать что-то вроде этого:

modelBuilder
    .Entity<Order>()
    .Property(e =>.CreationTime).Metadata.SetAfterSaveBehavior(PropertySaveBehavior.Ignore);
0 голосов
/ 30 января 2020

В соответствии с устаревшим свойством реализация :

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