8

私は Entity Framework を初めて使用します。以前は、Enterprise Library または ADO.NET を直接使用してモデルをデータベース テーブルにマップしていました。私が使用したパターンの 1 つは、すべてのテーブルに表示される共通の監査フィールドを基本クラスに配置し、その基本クラスをすべてのオブジェクトに継承することです。

2 つのフィールド (Created、CreatedBy) を保護するために 2 つの手順を実行します。

  1. ベース エンティティでパラメーターなしのコンストラクターをプライベートにし、作成時に Created と CreatedBy を渡す必要がある 2 つ目のコンストラクターを作成します。
  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 で私の目標を達成するためのより良いアプローチがあるかどうかです。

  1. インスタンス化時に Created および CreatedBy の値を入力する必要があります。
  2. Created と CreatedBy の値は変更できません。
4

2 に答える 2