0

だから、これを「Linq to Entities の監査」などと呼びたかったのですが、それは私がやりたかったことを完全にカプセル化していないことに気付きました。簡単に言えば、データ モデラーは、相互参照テーブル (多対多関係の中間を表すテーブル) であっても、アプリケーション内のすべてのテーブルに 4 つの列を配置する必要があります。

とにかく、変更の追跡に関する記事をたくさん読みました。これは、私がやりたいことに近いですが、正確ではありません。私がやろうとしているのは、モデルに含まれていない、更新する必要がある列を追加するために TSQL 生成をオーバーライドすることです。

編集

この質問についてさらに考えてみると、私の例が完全ではないことに気付きました... User <---> Roles の関係と、それがどのように機能するかを想像してみてください。通常、[Users]、[Roles]、および [UserRoles] の 3 つのテーブルを作成します。これらのテーブルには、多くのユーザーを多くのロールに参照するための 2 つの列があります。

ここで、3 つのテーブルすべてに、愛する DBA が CreatedBy、CreatedOn、UpdatedBy、UpdatedOn の 4 つの列を追加したとします。

コードでは、おそらく次の C# コードのように、各ユーザーに対するロールのコレクション (リスト、コレクション、スタックなど) を作成します。

public class User
{
    public int Id { get; set;}
    public string Username { get; set;}
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public string Password { get; set; }
    public List<Role> Roles { get; set; }
}

public class Role
{
    public int Id {get; set; }
    public string Code { get; set; }
    public string Description { get; set; }
}

Entity Framework を使用してモデルにフィールドを追加せずに、すべての更新および作成された列を正常に更新できた人はいますか?もしそうなら、彼らはこの例を提供できますか?

同じ質問ですが、NHibernate の場合です。NHibernate がこれをサポートするが、Entity Framework がサポートしない場合、私は Entity Framework を介して NHibernate を使用できるようにする権限を説得することに満足しています。これには正当な理由があるからです。

4

1 に答える 1

0

私は非常によく似た構造を持っています。フィールドを更新する唯一の方法は、それらをプロパティとしてオブジェクトに追加するか (AuditInfo クラスにカプセル化します)、またはトリガーを使用することです。ユーザーにはアプリケーションの監査フィールドが表示されるため、プロパティとして使用できるようにする必要があります。NHibernate は非常に拡張性が高いため、提案したことを実現できますが、それは見苦しいものです。

私の場合、アプリケーションには独自のユーザー管理があるため、トリガーは十分ではなく、アプリケーションで xBy プロパティを設定する必要があります。また、バックアップとしてトリガーを配置し、アプリケーションの外部で行われた変更 (データ スクラブ) を記録します。

多対多のテーブルは、監査フィールドを設定するためにドメイン モデルに含める必要があるため、大きな問題を引き起こします。私はそれをしないので、これらのテーブルについては、トリガーで利用可能な監査情報 (つまり、実際のユーザー名以外のすべて) しか持っていません。

AuditInfo クラス:

[Serializable]
public sealed class AuditInfo
{
    public AuditInfo()
    {
        SetCreated(string.Empty, DateTime.Now);
    }

    public string CreatedBy { get; private set; }
    public DateTime CreatedDate { get; private set; }
    public string RevisedBy { get; private set; }
    public DateTime RevisedDate { get; private set; }

    public string CreatedInfo
    {
        get { return "Created: " + CreatedDate.ToShortDateString() + " by " + CreatedBy; }
    }

    public string RevisedInfo
    {
        get { return "Revised: " + RevisedDate.ToShortDateString() + " by " + RevisedBy; }
    }

    internal void SetCreated(string createdBy, DateTime createdDate)
    {
        CreatedBy = createdBy;
        CreatedDate = createdDate;
        SetRevised(createdBy, createdDate);
    }

    internal void SetRevised(string revisedBy, DateTime revisedDate)
    {
        RevisedBy = revisedBy;
        RevisedDate = revisedDate;
    }
}

監査可能なエンティティによって実装されるインターフェース:

public interface IAuditable
{
    AuditInfo AuditInfo { get; }
}
于 2013-03-01T20:29:58.657 に答える