2016-09-26 9 views
0

私が関係を持つ2つのテーブルを持って、彼らは以下のとおりです。Entity Frameworkを持つテーブルを何度も更新する方法

表ユーザ - 表リージョン私の場合は

----------------- ----------------- 
' idUser  ' ' idRegion  ' 
'-------------- ' '---------------' 
' email  ' ' regionName ' 
'---------------' '---------------' 
' password  ' 
'---------------' 
' user_name ' 
'---------------' 
' phone_number ' 
'---------------' 
' id_Region '  
'---------------' 

、それは挿入と更新の3つの状態がありますデータ。

  1. ユーザーはメールとパスワードの行だけを入力します。
  2. ユーザーは、RegionNameを含む残りの行に値を設定できます。
  3. 最後に、ユーザーは自分が望む行を更新できますが、電子メールとパスワードは更新できます。

これは簡単なことですが、2番目の方法はうまくいきますが、問題は2番目の時間に更新しようとしたときに、Regiontable内で新しい行が作成されます選択されたフィールド。

マイコード:

public HttpResponseMessage Update(UsersGetModel usersGetModel) 
    { 
     using (var context = new GoneDatabase()) 
     { 
      try 
      { 
       var user = context.users.Where(a => a.idUser== usersGetModel.id).FirstOrDefault(); 
       user.userName = usersGetModel.Name; 
       user.PhoneNumber = usersGetModel.PhoneNumber;     
       user.Region = new region{ regionName= usersGetModel.Region }; 
       context.Entry(user).State = System.Data.Entity.EntityState.Modified; 
       context.SaveChanges(); 
       return Request.CreateResponse(HttpStatusCode.OK); 

      } 
      catch (Exception ex) 
      { 
       return Request.CreateResponse(HttpStatusCode.BadRequest); 
      } 
     } 
あなたは文字通りむしろ

user.Region = new region{ regionName= usersGetModel.Region }; 

新しい地域のインスタンスを構築することでそれを言っているので、それは、新しい行を作成しています

答えて

1

は、あなたが取得する必要があります既存のRegionインスタンスをDbContextから取得して使用します。

user.Region = context.Set<Region>().Where(r => r.Name.Equals(usersGetModel.Region).SingleOrDefault(); 

カップルノート:

  1. は「SingleOrDefaultは」例外がスローされます「どこ」の基準
  2. に一致する領域テーブルに複数の行がある場合は、データベースのテーブルの上にいくつかの制約を配置する必要がありますビジネスロジック/スペックがそれを示す場合、#1の発生を防ぐため
+0

ありがとうございます! –

関連する問題