2016-10-24 11 views
0
私は、次のエラーを取得しています

EFコア関連するエンティティを発行

Cannot insert explicit value for identity column in table 'Designator' when IDENTITY_INSERT is set to OFF 

Iは、機器エンティティと指示エンティティを持っています。私は新しい機器エンティティを作成し、機器のDESIGNATORプロパティをデータベースの既存の指定子に設定しています。

問題は、新しい機器をデータベースに挿入しようとするときに、新しいDESIGNATORを挿入しようとしていると思います。私のクライアント側のページには、DESIGNATORエンティティの選択可能なリストがあります。もちろん、これらのエンティティはデータベースのプライマリキーを持っています。しかし、クライアント側で私のEQUIPMENTエンティティのDESIGNATORナビゲーションプロパティを設定し、これをサーバにポストすると、DESIGNATORが新しいものであるため、プライマリキーが割り当てられない(したがってエラーが発生する)と考えられます。

以前のエンティティフレームワークバージョンを使用していたときに、これが起こっていなかったことはかなり確信しています。

[HttpPost] 
    public IActionResult PostEquipment([FromBody] Equipment equipment) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 


     if (EquipmentExists(equipment.EquipmentId)) 
     { 
      _context.Entry(equipment).State = EntityState.Modified; 
     } 
     else//updating 
     { 
      _context.Equipments.Add(equipment); 
     } 


     try 
     { 
      _context.SaveChanges(); 
     } 
     catch (DbUpdateException) 
     { 
      if (EquipmentExists(equipment.EquipmentId)) 
      { 
       return new StatusCodeResult(StatusCodes.Status409Conflict); 
      } 
      else 
      { 
       throw; 
      } 
     } 

     return Ok(equipment); 
    } 

ありがとう。

+0

残念ながら、保存する前にナビゲーションプロパティをクリアしないでください。 – Will

+0

Equipmentクラスのようなモデル定義と、サーバーに送信する前に新しいEquipment Objectを作成する方法を教えてください。 –

答えて

0

あなたの機器オブジェクトは、httpを介して送信され、その後、指定子オブジェクトと共にデシリアライズされます。このフルオブジェクトツリーは、EFコンテキストに追加されます。 EFは、指定値がすでにdbに保存されていることを知っていないので、新しい値として挿入しようとします。その標準的な動作。デジグネータエントリの状態を「変更済み」に手動で設定するか、dbから指定子をリロードする必要があります。

0

私はそれを理解しました。正しい方向に私を指してくれてありがとう。ウィルが言ったように、キーはクライアント側のナビゲーションプロパティをクリアしていたが、FK idを明示的に設定していた。ナビゲーションプロパティの明示的なFK設定もなかったので、それらを作成してからDESIGNATOR IDを取得したユーザーが選択したものを新しいEQUIPMENTエンティティで設定します。

ガイダンスをいただきありがとうございます。ほんとうにありがとう。

+0

あなたは答えに投票し、あなたが一番好きな答えを受け入れることができますか? –

関連する問題