2

たとえば、EF 4.3 Code First を使用して、すべてのエンティティ クラスに 'CreateDate' プロパティを設定しています。オブジェクトが最初に作成されたときを除いて、このフィールドへの変更がデータベースに送信されないようにしたいと思います。

これで、このプロパティを読み取り専用にすることができましたが、MVC4 フロント エンドを使用しているため、HTTP POST 操作中に新しいオブジェクトをインスタンス化し、受信プロパティ値にバインドする必要があります。次に、元のオブジェクトを読み取り、それに基づいて値を設定することができますが、これはあまり効率的ではありません。また、値を隠しフィールドに格納することもできますが、これは安全ではありません。

DbContext が変更を保存するときに、このフィールドへの更新を単純に抑制したいと考えています。これはできますか?どのように?

4

1 に答える 1

4

エンティティにマーカー インターフェイスを使用し、CreateDateそれをオーバーライドしてDbContext.SaveChangesからChangeTracker、値の設定またはリセットを使用しCreatedAtます。

複雑に聞こえるかもしれませんが、開始できる小さなサンプルを作成しました。

public interface ICreatedAt
{
    DateTime CreatedAt { get; set; }
}

public class MyEntity : ICreatedAt
{
    public int Id { get; set; }

    public DateTime CreatedAt { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<MyEntity> MyEntities { get; set; }

    public override int SaveChanges()
    {
        foreach (var entry in ChangeTracker.Entries<ICreatedAt>())
        {
            if (entry.State == System.Data.EntityState.Added)
            {
                entry.Entity.CreatedAt = DateTime.Now;
            }
            if (entry.State == System.Data.EntityState.Modified)
            {
                entry.Entity.CreatedAt = 
                    entry.OriginalValues.GetValue<DateTime>("CreatedAt");
            }
        }
        return base.SaveChanges();
    }
}
于 2012-05-20T07:13:58.100 に答える