0

Entity Framework と POCOS で ManyToMany 関係があります。

TransactionId 列とその他の列を持つ Transaction というテーブルがあり、これが挿入したいエンティティです。Reason と呼ばれる 1 つのテーブルは、ReasonId と ReasonDescription 列を持つカタログ テーブルです。Transaction_Reason というテーブルも 1 つあります。関係を保存するために、このテーブルには ReasonId と TransactionId という 2 つの列があり、それぞれのテーブルへのキーが関連付けられています。

EF のトランザクション構成では、コンストラクターに次のものがあります。

             base.HasKey(t => new { t.TransactionId }).HasMany(c => c.Reasons).WithMany(r => r.Transactions)
            .Map(t =>
            {
                t.MapRightKey("ReasonId");
                t.MapLeftKey("TransactionId");
                t.ToTable("Transaction_Reason");
            });

リレーションシップは正しく行われ、Transaction_ReasonTable に挿入されたレコードを取得しますが、Reasons テーブルをチェックするたびに、ここで作成されたレコードも取得しますが、これはカタログ テーブルのみである必要があります。

挿入コードは次のとおりです。

                if (reasons != null)
                {
                    foreach (var item in reasons)
                    {
                        Reason reason = _reasonReopository.Find(item);

                        transaction.Reasons.Add(reason);

                    }
                }

                transaction = this._repository.Create(transaction);
                this._repository.Commit();

Save メソッドで作成しているトランザクション テーブルと、Reason カタログ テーブルではなく、リレーションシップが保存される Transaction_Reason テーブルにレコードを挿入したいだけです。

これを回避する方法を知っている人はいますか?

4

1 に答える 1

0

その理由 :) は、独自のコンテキスト インスタンスを使用するreasonによってインスタンスをフェッチすることです。_reasonReopository.Find(item)transactionによって別のコンテキストに追加されますが、このコンテキストは のインスタンスをthis._repository.Create(transaction)「認識」しておらず、それらを新しいアイテムとして親切に挿入します。reasontransaction

これは、次の 2 つの方法で修正できます。

  • reasonと同じコンテキストでインスタンスをフェッチしますtransaction
  • reasonのコンテキストでインスタンスをReasonsDbSet にアタッチします。transaction

私は最初のオプションを好みますが、エンティティごとにリポジトリがあるように見えるので、オプション 2 がおそらくあなたの場合に最適です。ただし、リポジトリを「集約」ごとのリポジトリにリファクタリングすることを検討します。集約は、論理的に関連するエンティティの数です。ただし、集計間の境界線の描画は主観的なものになる可能性があります。

于 2012-05-10T09:31:15.347 に答える