私は Entity Framework を初めて使用します。以前は、Enterprise Library または ADO.NET を直接使用してモデルをデータベース テーブルにマップしていました。私が使用したパターンの 1 つは、すべてのテーブルに表示される共通の監査フィールドを基本クラスに配置し、その基本クラスをすべてのオブジェクトに継承することです。
2 つのフィールド (Created、CreatedBy) を保護するために 2 つの手順を実行します。
- ベース エンティティでパラメーターなしのコンストラクターをプライベートにし、作成時に Created と CreatedBy を渡す必要がある 2 つ目のコンストラクターを作成します。
- オブジェクトの作成後に値を変更できないように、setter を Private にします。
基本クラス:
using System;
namespace App.Model
{
[Serializable()]
public abstract class BaseEntity
{
public bool IsActive { get; private set; }
public DateTimeOffset Created { get; private set; }
public string CreatedBy { get; private set; }
public DateTimeOffset LastUpdated { get; protected set; }
public string LastUpdatedBy { get; protected set; }
private BaseEntity() { }
protected BaseEntity(DateTimeOffset created, string createdBy)
{
IsActive = true;
Created = created;
CreatedBy = createdBy;
LastUpdated = created;
LastUpdatedBy = createdBy;
}
}
}
継承クラス:
using System;
namespace App.Model
{
[Serializable()]
public class Person : BaseEntity
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public Person(DateTimeOffset created, string createdBy) :
base(created, createdBy) { }
}
}
私は両方の問題に遭遇しました。EF では、オブジェクトを作成するためにパラメーターなしのコンストラクターが必要です。EF は、プライベート セッターを持つデータベース列を作成しません。
私の質問は、EF で私の目標を達成するためのより良いアプローチがあるかどうかです。
- インスタンス化時に Created および CreatedBy の値を入力する必要があります。
- Created と CreatedBy の値は変更できません。