2017-01-26 16 views
1

自動生成されたテーブルにレコードを挿入します。EFコード最初、私はこのようなフォルダのモデルで二つのクラスを作成します

Material.cs:

public class Material 
{ 
    public int MaterialId { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Project> Project { get; set; } 
} 

Project.cs:

public class Project 
{ 
    [Key] 
    public int ProjectId { get; set; } 
    [Required] 
    public string Name { get; set; } 
    public DateTime Date { get; set; } 

    public ICollection<Material> Material { get; set; } 

} 

エンティティフレームワークコードはまず、SQLサーバーデータベースにMaterialProjectsという名前の新しいテーブルを生成します。私は足場を使ってControllersViewsを生成します。私はProjectsテーブルに新しいプロジェクトのレコードを追加する第一ステップで

  1. Material_MaterialId
  2. Project_ProjectId

MaterialProjectsは、このような2つの列を持っています。 2番目のステップでは、Materialsテーブルに新しい材料レコードを追加します。

私の質問は:MaterialProjectsテーブルにレコードを追加するにはどうすればいいですか?私は自分のコードでこのエンティティにアクセスできません。

更新日: 材料コントローラでアクションメソッドを作成しましたか?

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Create([Bind(Include = "MaterialId,Name,")] Material material) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Materials.Add(material); 
      //what to do here 
      await db.SaveChangesAsync(); 
      return RedirectToAction("Index"); 
     } 

     return View(material); 
    } 

答えて

1

あなたはそのテーブルに追加する必要はありません。これはEF automaticalyによって行われます。エンティティを正しく追加するためにIDを実行する必要があるのは唯一のことで、接合テーブルはEFで埋め尽くされます。

In controller you can do like this .I tested with console application. 

      [HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Create([Bind(Include = "MaterialId,Name,")] Material material) 
    { 
     if (ModelState.IsValid) 
     { 

     using (var ctx = new SampleDbContext()) 
     { 
      -- here context is the DBCOntext class of your application 
      --var mat = new Material 
      --{ 
      -- Name = "A", 
      -- Project = new List<Project> {new Project {Name = "P1", Date = DateTime.Now}} 
      --}; 

      ctx.Materials.Add(material);   
      await db.SaveChangesAsync(); 

     } 

      return RedirectToAction("Index"); 
     } 

     return View(material); 
    } 
+0

@distance私の答えを確認してください。 –

+0

@distance:プロジェクトを追加する必要がない場合は省略することができます。サンプルコードを作成して、プロジェクトを追加するかどうかをテストするだけで、プロジェクトも挿入されます。 –

1

EFが自動的にあなたのケースをtables.In多く、多くの接合を扱う、あなたは二つの新しいMaterialエンティティに新しいProjectを挿入したいと言います。これを行うには、ProjectエンティティのMaterialコレクションに品目コレクションを割り当てます。 EFは、新しいプロジェクトの2つの新しい素材をはめ込みますし、OPは、たとえば(すでにプロジェクトエンティティが挿入されていたことを、そのプロジェクトのIDを期待して質問 を更新した後も自動的に

更新を接合テーブルを移植します100です)。新しいMaterialエンティティを追加している間:

var proj = context.Projects.Find (100); 
newMaterialObject.Projects.Add (proj); 
context.SaveChanges(); 
関連する問題