0

これが私のシナリオです(テーブル):

Departments
====================
Id (int)
Name (varchar)

Employees
====================
Id (int)
Name (varchar)

EmployeesDepartmentXREFs
====================
EmployeeId (int)
DepartmentId (int)

これら 3 つのテーブルを EDMX モデルにインポートすると、Employee と Department の 2 つのエンティティが得られます。Entity Employee にはナビゲーション プロパティ Departments があり、エンティティ Department にはナビゲーション プロパティ Employees があります。

そして、これはすべて問題ありません。実はこういうの好きです。

しかし、XREF テーブルにさらにフィールドを追加したい場合に問題が発生します。たとえば、DateCreated、UserId フィールドを使用して、変更がいつ誰によって行われたかを記録したいと考えています。これら 2 つのフィールドを XREF テーブルに追加すると、EDMX モデルには 2 つではなく 3 つのエンティティが表示されます。大きな問題ではありませんが、コーディングはすでに完了しているので、(コーディングを避けるための) 簡単な解決策を探しています。

質問:新しいフィールドを XREF (相互参照) テーブルに追加して、エンティティを 2 つだけ保持することはできますか? はいの場合、日時とユーザー ID 情報を更新するにはどうすればよいですか?

(日付とユーザー ID を使用して) 更新できるようにするには XREF エンティティが存在する必要があると思いますが、ナビゲーション プロパティ EmployeesDepartmentXREFs ではなく、 Departments と Employees を持つナビゲーションプロパティ本当に好きです

これの中間点はありますか?ベストプラクティスは何ですか?

ありがとう。

4

2 に答える 2

1

読み取り専用のヘルパープロパティを作成できます。

public class Department
{
    //...
    public ICollection<EmployeesDepartment> EmployeesDepartments { get; set }

    // because here is only a getter the property is ignored for mapping to DB
    public IEnumerable<Employee> Employees
    {
        get { return EmployeesDepartments.Select(ed => ed.Employee); }
    }
}

ただし、これには、データベースからインクルードを既にロードしているか、EmployeesDepartments遅延Employeeロードを使用し(ナビゲーションプロパティをとしてマークvirtual)、部門がロードされたコンテキストがまだ破棄されていないことが必要です。Departmentまた、このプロパティは、との間の関係を追加または削除するのに役立ちませんEmployee

とにかく、カスタムコードを書く必要があります。自動ゲッターとセッターを使用してプロパティを導入し、中間エンティティを何らかの形で「スキップ」するマッピングを指定する方法はありません。結合テーブルにプロパティを追加すると、モデルには多対多の関係がなくなります。ベストプラクティスは、モデルを2つの1対多の関係と見なすことです。

于 2012-03-23T22:20:05.860 に答える
1

これが最初にモデルで機能するかどうかは完全にはわかりませんが、NotMappedAttributeを使用できます。これで 3 番目のエンティティが表示されなくなるかどうかは特にわかりませんが、見下ろす道であることは間違いありません。

アップデート

周りを見回した後、この MSDN フォーラムの質問を見つけました。これは、コード ファーストの前のように聞こえ (流暢な API を介してマッピング テーブルに 2 つ以上の列を許可すると信じています)、問題に適合します。

流暢な API を試すこともできますが、これでモデル ファーストの問題が修正されるかどうかはわかりません。 これは、流暢な API を使用して列を一緒にマップする方法を示す、スタック オーバーフローに関する適切な質問です。

最後に、これはあなたの問題に関する良い記事です。

うまくいけば、これはあなたのために物事を助け/明確にします.

于 2012-03-23T20:32:41.447 に答える