如何防止 EF Core 3.1 中的列更新?

Jho*_*tan 6 c# entity-framework-core ef-core-3.0 ef-core-3.1

我从 .Net Core 2.2 升级到 3.1,此功能已被弃用

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

Run Code Online (Sandbox Code Playgroud)

我需要 EF 来执行插入但阻止更新。

谢谢!

Dou*_*s C 8

根据官方文档,IsStoreGenerateAlways从3.1开始就已经过时了。

Microsoft.EntityFrameworkCore.Metadata 程序集:

如果为 Throw,则在实体存在于数据库中之后,如果为该属性分配新值,则会引发异常。

如果忽略,则对数据库中已存在的实体的属性值的任何修改都将被忽略。

你应该尝试这样的事情:

modelBuilder
    .Entity<Order>()
    .Property(e =>.CreationTime).Metadata.SetAfterSaveBehavior(PropertySaveBehavior.Ignore);
Run Code Online (Sandbox Code Playgroud)


Iva*_*oev 3

根据过时的属性实现

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

等效代码应将BeforeSaveBehavior和设置AfterSaveBehaviorIgnore

此外,由于BeforeSaveBehaviorAfterSaveBehavior属性已被替换为Get/Set方法对,因此需要引入一个临时变量来保存属性元数据。

像这样的东西:

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