2017-01-25 6 views
0

私のモデルのいずれかをEntityState.Modifiedで更新する際に問題があります。ナビゲーションプロパティ(これは変更しません)を更新しようとしています。EntityState.Nodificationプロパティを更新せずに変更しました

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Rooms([Bind(Include = "ID,BedroomCount,BedroomsDescription,BathroomCount,BathroomsDescription")] Property property) 
    { 
     if (ModelState.IsValid) 
     { 
      //Modify property 
      property.DateModified = DateTime.Now; 
      property.Status = 1; 
      db.Entry(property).State = EntityState.Modified; 
      await db.SaveChangesAsync(); 
      return RedirectToAction("Index"); 
     } 

     return View(property); 
    } 

など、私のモデルはなります:私のコントローラのアクションがあるあなたが見ることができるように、私は私のViewModelからのもの(バスルームとベッドルームの数など)の束を結合

public class Property 
{ 
    public int ID { get; set; } 

    public Int16 BedroomCount { get; set; } 

    public string BedroomsDescription { get; set; } 

    public Int16 BathroomCount { get; set; } 

    public string BathroomsDescription { get; set; } 

    public int CommunityID { get; set; } 

    public int PropertyTypeID { get; set; } 

    public virtual Community Community { get; set; } 
    public virtual PropertyType PropertyType { get; set; } 
} 

、しかし、私は思いますすべてのナビゲーションプロパティ「コミュニティ」を修正するが、私は、このアクションメソッドに投稿するたびに、私は次のエラーを取得しませ:

The UPDATE statement conflicted with the FOREIGN KEY constraint "FK_dbo.Property_dbo.Community_CommunityID". The conflict occurred in database "MyDatabase", table "dbo.Community", column 'ID'. The statement has been terminated.

私はそれが外部キーを更新しようとせずに、このモデルを更新することができますどのように?どこでも答えが見つかりません

+0

私はこの問題に直面しています。私はproperty.Community = nullを使用して解決しました。私はそれが恒久的な修正ではないことを知っていますが、私も答えを見つけることができませんでした –

+0

ええ、残念ながら私はnullとして私のコミュニティをしたくありません。今私はそれも私のビューモデルからも渡すことができますが、変更する必要はないので実際には不要です。 – Gavin5511

+0

私の場合は、エンティティ固有のデータアクセスから自分のエンティティを更新していました。子を更新するための呼び出しを知ることはできません。 –

答えて

1

こんにちは、私はそれがうまくいくことを祈ってください。

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Rooms([Bind(Include = "ID,BedroomCount,BedroomsDescription,BathroomCount,BathroomsDescription")] Property property) 
{ 
    if (ModelState.IsValid) 
    { 
     // try this read this entoity from context and update properties you need to update 
     var dbproperty = db.Property.FirstOrDefault(x=>x.Id= property.Id); // handle null 
     //Modify property 
     dbproperty .DateModified = DateTime.Now; 
     dbproperty .Status = 1;  

     // assuming in your context class Properties is the name of table. 
     db.Entry(dbproperty).State = EntityState.Modified; 
     await db.SaveChangesAsync(); 
     return RedirectToAction("Index"); 
    } 

    return View(property); 
} 
+0

上記のコードは、データベースに新しいエントリを作成しようとしているようですが、既存のエントリを変更したいのですか? – Gavin5511

+0

問題がある場合はお知らせください。私はこの行が存在していると仮定しています。それ以外の場合は、私が答えでコメントしたようにFirstOrDefaultのnullのケースを処理できます –

+0

この "db.properties.Add(dbproperty)"は明らかにコンテキストにプロパティを追加しようとしていて、 「同じエンティティがすでに存在しています」と私は信じています –

0

navプロパティの状態もEntityState.UnchangedまたはEntityState.Modifiedに設定します。

db.Entry(property).State = EntityState.Modified;の前にnavプロパティをnullに設定します。

関連する問題