0

に多くの私はこのような多対多の関係を持つ2つのテーブルを持っている:Entity Frameworkの:多くの関係

ユーザー(EMAILADDRESS、名前)

UserAlerts(EMAILADDRESSAlertId

アラート(AlertId、タイトル)

アラートはすでにデータベースに追加されています。新しいユーザーを挿入するときは、AlertRepositoryを参照しています。問題は、ユーザーUsertAlertsテーブルにのみレコードを作成する代わりに、さらにアラートレコードを追加することです。

私は、次のコードを使用しています:

public ActionResult Register(UserModel model, int[] Alerts) 
User user = new MidTier.Models.User(); 
user.Name = model.Name; 
user.EmailAddress = model.EmailAddress;  
if (Alerts!=null) 
     {    
     IRepository<Alert> alertRepository = new AlertRepository(); 
     foreach (int alertId in Alerts) 
      { 
       Alert alert = alertRepository.First(a=>a.ID== alertId); 
       alertRepository.Detach(alert); 
       if (alert != null) 
        { 
        alert.Enabled = true; 
         user.Alerts.Add(alert); 
        }       
      } 

     } 
    userRepository.Attach(user); 
    userRepository.Add(user); 
    userRepository.Save(); 

答えて

0

なぜあなたは、あなたが質問をする前に、少し検索してみませんか?この問題は週に数回尋ねられます。以前の質問では、AlertをロードしてUserを格納するために同じコンテキストを使用する必要があるとお伝えしました。あなたはそれをやっておらず、複雑な状況です。

コンテキストはアラートの存在について何も知らない。ユーザーにAddを呼び出すと、まだ追跡されていないすべてのエンティティが追加されます。これを解決するには3つの方法があります:

  • 両方のリポジトリで同じコンテキストを使用し、アラートを切断しないでください。アラートが読み込まれるため、コンテキストはその存在を知り、再度挿入しません。
  • 読み込みに同じコンテキストを使用しない場合は、Userに追加する前に、新しいコンテキストにAlertを添付する必要があります。それはリポジトリにEFコードをラップするときには難しいことです。
  • あなたは同じコンテキストを使用していないし、あなたがUserのためのあなたのAdd方法を変更する必要がありますし、コンテキストにUserを追加した後、あなたがすべてのアラートと変更を繰り返す必要がありますUserに追加する前に、新しいコンテキストにAlertを添付しない場合その状態はUnchangedになります。
関連する問題