2017-06-07 2 views
0

おはよう! 私はEFでAsp.net MVCを使用します。 私は2つのモデル多多くの多対多の関係で作業するC#

public class Product 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
     public ICollection<Category> categories { get; set; } 
    } 

    public class Category 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
     public ICollection<Product> products { get; set; } 
    } 

を持っているがnormaly私は新製品を追加した場合、動作しますが、私は、更新製品のエンティティをしようとした場合、新たな関係が追加does notの追加します。 は、私は、製品のエンティティの更新で関係を追加/削除することができますどのようにこの

Product product= new Product{...}; 
product.categories.Add(db.Categories.First())//example 

などの新製品を追加しますか?

+0

基本的には同じです。しかし、 'new Product'の代わりに' db.Products.FirstOrDefault(p => p.Id == productId) 'のようなものをデータベースから取得します。 –

答えて

0

まず、あなたのICollection<T>は仮想プロパティでなければなりません:2との対応表を作成し、

public class Product 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<ProductCategory> ProductCategories { get; set; } 
} 

public class Category 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<ProductCategory> ProductCategories { get; set; } 
} 

次へ:

public class ProductCategory 
{ 
    public virtual Product Product { get; set; } 
    public virtual Category Category { get; set; } 
} 

を次に、あなたのdbContextで、関係を追加します。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<ProductCategory>() 
     .HasKey(c => new { c.CategoryId, c.ProductId }); 

    modelBuilder.Entity<Product>() 
     .HasMany(c => c.ProductCategories) 
     .WithRequired() 
     .HasForeignKey(c => c.ProductId); 

    modelBuilder.Entity<Category>() 
     .HasMany(c => c.ProductCategories) 
     .WithRequired() 
     .HasForeignKey(c => c.CategoryId); 
} 
+1

しかしEntityフレームワークは自動的に関連付けテーブルを作成します – Starter

+1

' virtual'はそうではありません必須。 –

+0

Fluent APIを使用していますか?もしそうなら、ここで確認することができます:http://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx –