2017-12-31 114 views
0

.NET APIには、フロントエンドの角度フレームワークと組み合わされた基本エンティティクラスがあります。私は2つのクラス、プロジェクトと会社を持っています。プロジェクトを作成するときは、会社を割り当てる必要があります。 POST要求をプロジェクトコントローラに送信するとき、会社は保存されません。基本的なEntity Framework Web API:FOREIGN KEY制約と競合するINSERTステートメント

クラスは次のとおりです。

public class Project 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public Company Company { get; set; } 
    public Contact Contact { get; set; } 
    public User2 User { get; set; } 
} 

コントローラのメソッドは次のとおりです。

// POST: api/Projects 
    [ResponseType(typeof(Project))] 
    public IHttpActionResult PostProject(Project project) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 
     db.Projects.Add(project); 
     db.SaveChanges(); 
     return CreatedAtRoute("DefaultApi", new { id = project.Id }, project); 
    } 

JSONのPOSTデータがここにある

{ 
    "name":"project name", 
    "description":"text description", 
    "company":{"id":"1"}, 
    "contact":{"id":"1"}, 
    "user":{"id":"1"} 
} 

なぜ会社、連絡先、ユーザーのIDのは、外部キーテーブルを更新しないでください。外部キーを保存するためにコントローラメソッドに渡すにはどのような値が必要ですか?

答えて

0

この場合はもう一度必要です。関連するエンティティは、保存する前にdbコンテキストで取得しなければなりません。そうしないと、関連する新しいエンティティが作成されます。 プロパティとしてIDのみを渡す場合は、まず関連エンティティをdbから取得します。

// POST: api/Projects 
    [ResponseType(typeof(Project))] 
    public IHttpActionResult PostProject(Project project) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 
     db.Projects.Add(project); 
     project.Company = db.Companies.First(x => x.Id == project.Company.Id); 
     project.User = db.User2.First(x => x.Id == project.User.Id); 
     project.Contact = db.Contacts.First(x => x.Id == project.Contact.Id); 
     try 
     { 
      db.SaveChanges(); 

     } 
     catch (Exception e) 
     { 
      Debug.Write(e); 
     } 
     return CreatedAtRoute("DefaultApi", new { id = project.Id }, project); 
    } 
1

外部キーとは、その値が親テーブルの値に依存することを意味します。 意味、それが依存する列を親表から挿入する値。 Tutorials Pointから

外部キーは、2つのテーブルをリンクするために使用されるキーです。これは、 とも呼ばれ、参照キーと呼ばれることもあります。

外部キーは、 の値が異なるテーブルの主キーと一致する列または列の組み合わせです。

2つのテーブル間の関係は、 2番目のテーブルに外部キーを持つテーブルのいずれかのプライマリキーと一致します。

テーブルに任意のフィールドにプライマリキーが定義されている場合、 にはそのフィールドの値と同じ値を持つ2つのレコードを持たせることはできません。

したがって、問題を解決してコードを修正するには、列が親テーブルから依存する主キーの値がわかっている必要があります。

これも同様に制約エラーです。

+0

説明のためにありがとう。それは私が問題を理解するのに少し役立ちます。 Entity Frameworkはプロセスのその部分を自動化する必要がありますが、私はそれがどのようにセットアップされているのか明確に分かりません。どのようにエンティティがその外部キーを見つけるのを自動化するのか? –

関連する問題