1

私はこのようなものを持っています:

modelBuilder.Entity<TransactionHistory>()
                .HasOptional(history => history.Sender)
                .WithMany()
                .Map(s => s.MapKey("Sender"))
                .WillCascadeOnDelete(false);

modelBuilder.Entity<TransactionHistory>()
                .HasOptional(history => history.Receiver)
                .WithMany()
                .Map(s => s.MapKey("Receiver"))
                .WillCascadeOnDelete(false);

また、私のテーブル TransactionHistory では、Sender 列と Receiver 列に一意の識別子が作成されます。これらの列を一意にしたくないのですが、どうすればよいですか?

TransactionHistory モデル:

public class TransactionHistory
    {
        public Account Sender { get; set; }
        public Account Receiver { get; set; }
    }

編集:わかりました。どうやらuniqueidentifiersはそうではありません。問題は、トランザクション履歴アイテムをデータベースに追加しているときに、次のエラーが発生したことです。

PRIMARY KEY 制約 'PK_dbo.Accounts' に違反しています。オブジェクト 'dbo.Accounts' に重複するキーを挿入できません。\r\nステートメントは終了しました。

このアイテムを次のように追加します。

context.Transactions.Add(history);
context.savechanges();

(Transactions は transactionhistory オブジェクトです)

4

2 に答える 2

2

プリンシパルの (= s) プライマリ キーがC# では, likeであるため、 EF はuniqueidentifier外部キーの SQL 列の型として使用します。AccountuniqueidentifierGuidpublic Guid AccountId { get; set; }

このタイプを選択する必要があるのは、データベース内の外部キー関係でプリンシパル キーと従属キーのタイプが一致する必要があるためです。

これは、外部キー列が一意である (または一意のインデックスを持つ) という意味ではありません。もちろん、同じuniqueidentifier値を外部キー列の値として複数回使用できます。

于 2012-12-28T19:07:01.280 に答える
1

エンティティ フレームワークは、一連のオブジェクトのキャッシュを DBContext に格納することで機能します。アカウント オブジェクト (pk を含む) ですべてのプロパティが同じであっても、エンティティ フレームワークは、「これについては既に知っている」ことを思い出させない限り、これを新しいオブジェクトとして認識します。これを行うには2つの方法が考えられます:

context.Entry(history.Sender).State = EntityState.Modified; 
context.Entry(history.Receiver).State = EntityState.Modified; 

また

履歴オブジェクトにアカウントを設定するときは、それらが既に dbcontext に関連付けられていることを確認してください。

var sender = context.Accounts.FirstOfDefault(...your condition here...);
var receiver = context.Accounts.FirstOfDefault(...your condition here...);

history.Sender = sender;
history.Receiver = receiver;

また、EF は、指示しない限り、ナビゲーション/関連エンティティを読み込みません。したがって、履歴を編集している場合は、必ず.Include()を使用して関連オブジェクトを取得してください。

それが役立つことを願っています。

于 2012-12-28T18:48:21.430 に答える