【问题标题】:How to prevent a column update in EF Core 3.1?如何防止 EF Core 3.1 中的列更新?
【发布时间】:2020-05-15 13:54:57
【问题描述】:
我从 .Net Core 2.2 升级到 3.1,此功能已被弃用
modelBuilder
.Entity<Order>()
.Property(e => e.CreationTime)
.ValueGeneratedOnAddOrUpdate()
.Metadata.IsStoreGeneratedAlways = true;
我需要 EF 进行插入但阻止更新。
谢谢!
【问题讨论】:
标签:
c#
entity-framework-core
ef-core-3.0
ef-core-3.1
【解决方案1】:
根据官方documentation,IsStoreGeneratedAlways 从 3.1 开始就已经过时了。
Microsoft.EntityFrameworkCore.Metadata 程序集:
如果 Throw,则在分配新值时将引发异常
实体存在于数据库中后,添加到该属性。
如果忽略,则对实体的属性值进行任何修改
数据库中已经存在的将被忽略。
你应该试试这样的:
modelBuilder
.Entity<Order>()
.Property(e =>.CreationTime).Metadata.SetAfterSaveBehavior(PropertySaveBehavior.Ignore);
【解决方案2】:
根据废弃属性implementation:
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);