背景: "Item"エンティティが追加または更新されるたびにLastUpdatedDateを自動的に生成するSaveChanges()メソッドをオーバーライドします。読み取り専用としてマークされたEFコアの計算されたプロパティ
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'プロパティは、保存後に読み取り専用に定義されていますが、値が変更されたか、変更済みとしてマークされています。以下に示すように
は、この問題を回避するために、私は、falseにIsReadOnlyBeforeSaveとIsReadOnlyAfterSave を設定しなければならなかった:
modelBuilder.Entity<Tray>()
.Property(b => b.LastUpdated)
.ValueGeneratedOnAddOrUpdate()
.Metadata.IsReadOnlyBeforeSave = false;
modelBuilder.Entity<Tray>()
.Property(b => b.LastUpdated)
.Metadata.IsReadOnlyAfterSave = false;
質問:
が、これは計算された設定に正しい方法ですEFコアのプロパティ
さらに、最初の場所でLastUpdatedが「読み取り専用」として定義されないようにすることはできますか?
はい、私はデータベース上で生成していないため、アノテーションは不要でしたので、今すぐ取得します。しかし、Metadata.IsReadOnlyBeforeSave設定はどうでしょうか?計算されたプロパティごとに両方をfalseに設定することをお勧めしますか? – proggrock
編集をご覧ください。 –