【发布时间】:2016-09-01 18:20:36
【问题描述】:
背景:我正在重写 SaveChanges() 方法,以便在添加或更新“Item”实体时自动生成 LastUpdatedDate。
Item.cs
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime? LastUpdated { get; set; }
DbContext
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
...
// generated value
modelBuilder.Entity<Item>()
.Property(b => b.LastUpdated)
.ValueGeneratedOnAddOrUpdate();
}
public override int SaveChanges()
{
var now = DateTime.UtcNow;
foreach (var item in ChangeTracker.Entries<Item>()
.Where(e => e.State == EntityState.Added || e.State == EntityState.Modified))
{
item.Property("LastUpdated").CurrentValue = now;
}
return base.SaveChanges();
}
我遇到的问题是,每当调用 SaveChanges() 时,我都会收到此异常:
EntityFramework.Core.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理。
附加信息:实体类型“Item”的属性“LastUpdated”在保存后被定义为只读,但其值已被修改或标记为已修改。
要解决此问题,我必须设置 IsReadOnlyBeforeSave 和 IsReadOnlyAfterSave 为false,如下图:
modelBuilder.Entity<Tray>()
.Property(b => b.LastUpdated)
.ValueGeneratedOnAddOrUpdate()
.Metadata.IsReadOnlyBeforeSave = false;
modelBuilder.Entity<Tray>()
.Property(b => b.LastUpdated)
.Metadata.IsReadOnlyAfterSave = false;
问题:
这是在 EF Core 中设置计算属性的正确方法吗?
此外,我可以首先防止 LastUpdated 被定义为“只读”吗?
【问题讨论】:
标签: c# entity-framework entity-framework-core