簡體   English   中英

使用Entity Framework中的導航屬性填充多對多關系表

[英]populate many-to-many relationship table using navigation properties in Entity Framework

我正在asp.net mvc應用程序中學習實體框架。 我有3個模型-

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;}
    }

我遵循“代碼優先”方法,因此成功創建了表。 但是,現在我被困在如何填充和顯示此信息上。 我有以下輸入數據: List<AppModel> List<CategoryModel>Dictionary<"appname", List<CategoryModel>>

如何從這里繼續,以便可以更新映射表?

另外,想了解這是否是表示數據的正確方法。 由於一個應用程序可以具有多個類別-我希望輸出是唯一應用程序的集合以及每個應用程序的類別列表,例如:

Dictionary<AppModel, List<CategoryModel>>

編輯:這是我嘗試根據smoksnes-的建議

    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();

此后,EF發揮了作用-映射表中有2個類別,2個應用程序和4個條目。

盡管這可行,但是不確定誰阻止EF為類別創建4個條目?

正如Barry O´Kane在您的評論中提到的那樣,沒有理由保留App_CategoryModel模型。 EF將為您管理。 僅當它包含有關兩個表之間的關系的任何其他信息時,才應保留它。 但是根據您的示例,沒有理由保留它。

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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM