2016-05-09 6 views
0

asp.net mvcアプリケーションでEntity Frameworkを学習しています。私は3つのモデルを持っています -Entity Frameworkでナビゲーションプロパティを使用して多対多リレーションシップテーブルを設定する

AppModel、CategoryModelとApp_CategoryModel(AppModelとCategoryModelの間に多くの関係をたくさん指定するため)。このコードは次のとおりです。

public class CategoryModel 
    { 
     [Key] 
     public int id { get; set; } 
     public string Name {get; set; } 
     public virtual ICollection<App_CategoryModel> mapping { get; set; } 
    } 

    public class AppModel 
    { 
     [Key] 
     public int id { get; set; } 
     public string Name { get; set; } 
     public virtual ICollection<App_CategoryModel> mapping { get; set; } 
    } 

    public class App_CategoryModel 
    { 
     [Key] 
     public int id {get; set;} 

     public int AppId {get; set; } 
     public int CategoryId {get; set; } 

     public virtual AppModel App {get; set;} 
     public virtual CategoryModel Category {get; set;} 
    } 

「コードファースト」のアプローチに従っていて、テーブルが正常に作成されました。しかし、今私はこの情報を入力して表示する方法についていません。 I入力データとして、以下があります。 List<AppModel> List<CategoryModel>と私はマッピングテーブルを更新できるように

Dictionary<"appname", List<CategoryModel>>がどのように私はここから上に移動しますか?

また、これがデータを表現する正しい方法であるかどうかを理解したかったと思います。アプリケーションが複数のカテゴリを持つことができますので、 - 私は、各アプリのカテゴリのリストと一緒にユニークなアプリのコレクションとして出力を期待し、何かのように:

Dictionary<AppModel, List<CategoryModel>> 

編集: これは私が通り試したものです2種類、2つのアプリケーションとマッピングテーブルに4つのエントリ - この後

List<CategoryModel> cat_list = new List<CategoryModel>(); 
    CategoryModel c1 = new CategoryModel(); 
    c1.Name = "string1"; 
    cat_list.Add(c1); 

    CategoryModel c2 = new CategoryModel(); 
    c2.Name = "string2"; 
    cat_list.Add(c2); 

    List<AppModel> app_list = new List<AppModel>(); 
    AppModel a1 = new AppModel(); 
    a1.Name = "app1"; 
    app_list.Add(a1); 

    AppModel a2 = new AppModel(); 
    a2.Name = "app2"; 
    app_list.Add(a2); 

    a1.mapping.Add(c1); 
    a1.mapping.Add(c2); 
    a2.mapping.Add(c1); 
    a2.mapping.Add(c2); 

    db.categories.AddRange(cat_list); 
    db.apps.AddRange(app_list); 

    db.SaveChanges(); 

smoksnes-からの提案は、EFはexpetedとして働きました。

これは機能しましたが、カテゴリの4つのエントリを作成するEFを停止している人はいませんか?

+1

必要です'App_CategoryModel'クラスはまったくですか? 'AppModel'の' CategoryModel'と 'ICollection 'で 'ICollection 'を使うと、EFは中間テーブルを生成しませんか? –

答えて

0

あなたのコメントに記載されているBarry O´Kaneと同じように、App_CategoryModelモデルを保持する理由はありません。 EFがこれを管理します。 2つのテーブルの関係に関する追加情報が含まれている場合にのみ、それを保持する必要があります。しかし、あなたの例によると、それを保つ理由はありません。

public class CategoryModel 
{ 
    public CategoryModel() 
    { 
     AppModels = new List<AppModel>(); 
    } 

    [Key] 
    public int id { get; set; } 
    public string Name {get; set; } 
    public virtual ICollection<AppModel> AppModels { get; set; } 
} 

public class AppModel 
{ 
    public AppModel() 
    { 
     // Not sure if this is actually needed anymore. But EF usually adds it. 
     CategoryModels = new List<CategoryModel>(); 
    } 

    [Key] 
    public int id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<CategoryModel> CategoryModels { get; set; } 
} 

あなたの表現についての質問に関して、私はそれは必要ではないと思います。 AppModelに既にCategoryModelが接続されているため、Dictionaryの理由はありません。代わりにList<AppModel>に保存することができます。

IList<AppModel> myApps = context.AppModels.ToList(); 

foreach (var myApp in myApps) 
{ 
    Console.Writeline("App {0} has the following categories:", myApp.id); 
    foreach (var category in myApp.CategoryModels) 
    { 
     Console.Writeline(category.Name); 
    } 
} 

そして、あなたはアプリにカテゴリを追加したい:

// I don't know how you create your Context, so below it's just called context. 
var newCategoryModel = new CategoryModel 
{ 
    Name = "SO is awesome!" 
}; 
var appModel = context.AppModels.FirstOrDefault(x => x.id == 1); 
appModel.CategoryModels.Add(newCategoryModel); // EF will automatically set foreign keys for you... 
context.SaveChanges(); 

そして、あなたは何のカテゴリーが二回追加されていないことを確認するには:あなたが

public void AddCategory(int appId, string categoryName) 
{ 
    using(var context = new DbContext()) 
    { 
     var category = context.CategoryModels.FirstOrDefault(x => x.Name == categoryName); 
     if(category == null) 
     { 
      // Only create new CategoryModel if it doesn't exist. 
      category = new CategoryModel 
      { 
       Name = categoryName 
      }; 
     } 
     var appModel = new AppModel 
     { 
      id = appId 
     }; 
     // Attach to save on db-trip 
     context.AppModels.Attach(appModel); 

     //TODO: Possibly check if this particular appModel already has this category? 
     appModel.CategoryModels.Add(category); 
     context.SaveChanges(); 
    } 
} 
+0

ありがとう!!それを試して更新します。私は要件に関する私の質問で明確ではなかった - 私はカテゴリーのリストとアプリのリストを持っているので、このアプローチではまずdbのカテゴリーを更新し、返された主キーを使ってアプリ内を更新し、アプリはdbで。それ以外の場合、複数のアプリに複数のカテゴリがある場合、カテゴリテーブルに不要な重複がある可能性があります。 – pankaj

+0

@pankajはい、データでテーブルを更新する必要があります。しかし、この解決策も違いはありません。同じデータベーステーブルが生成されます。保守するコードが少なくて済みます。また、新しいカテゴリを追加したり、そのカテゴリがすでに名前に基づいて存在するかどうかを確認するためのサンプル関数を追加しました。 – smoksnes

+0

ここからあなたはどこですか? – pankaj

関連する問題