繁体   English   中英

设置相关数据的模型MVC 5 / EF6

[英]Setting up Models for related data MVC 5/EF6

我已经尝试了一段时间,但找不到适合我的答案。 这个概念很普遍,因此我必须完全误解一个基本概念。 如果我有一个可以在许多食谱类别中找到的食谱类,那么我就有;

public class Recipe
{
    public int ID { get; set; }
    public string Title { get; set; }

    public int CategoryID { get; set; }

    public virtual ICollection<Category> Categories { get; set; }
}

public class Category
{
    public int ID { get; set; }
    public string Description { get; set; }

    public int RecipeID {get; set;
    public virtual void Recipe Recipe {get; set;}

但是我还需要一个将配方与类别相关联的联接表。 我想展示这个;

食谱标题| 类别

Mac-N-Cheese | 面食| 简单

锅烤| 牛肉 慢炖锅

类别是可用类别的表。 所以联接表有

RecipeID | 类别ID

我尝试使用外键和导航属性的Entity Framework格式设置模型。

所以我像这样建立了联接表; 公共类RecipeCategories {public int ID {get; 组; } public int RecipeID {get; 组; } public int CategoryID {get; 组; }

    public virtual ICollection<Recipe> Recipes { get; set; }
    public virtual ICollection<Category> Categories { get; set; }
}

因此,配方可以有很多类别。 联接表可以具有许多配方和许多类别。 类别表只是类别的简单列表。 我想念什么? 当我尝试运行视图时,没有给定配方的类别列表。 我取得的最好成绩是CategoryID。

抱歉,很长的帖子,但您需要所有详细信息。

问题是您的类别模型。 当前定义它的方式是,类别和食谱之间存在一对多关系(一种食谱可以具有多个类别,而一个类别可以具有一个食谱)。 您想要的是多对多关系,因此在“类别”上放置“食谱”集合,EF应该会自动生成联接表。

public class Recipe
{
    public int ID { get; set; }
    public string Title { get; set; }

    public int CategoryID { get; set; }

    public virtual ICollection<Category> Categories { get; set; }
}

public class Category
{
    public int ID { get; set; }
    public string Description { get; set; }

    public virtual ICollection<Recipe> Recipes { get; set; }
}

您尝试实现时,我没有得到实际的情况。

正如您提到的模型,然后您所期望的都矛盾。 按照您的说法,您有配方和类别(一对多),但后来您更改了模型并提到了您想要的(许多对很多),因此需要连接表。 作为关系模型,您可以在EF中处理2种方法。 第一种方法是不创建单独的表并保留对每个模型的映射,第二种方法是创建单独的表并在模型中显式映射。 您需要在建立模型时明确指定。

 protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); modelBuilder.Entity<Recipe>() .HasMany(c => c.Categories).WithMany(i => i.Recipes) .Map(t => t.MapLeftKey("RecipeID") .MapRightKey("CategoryID") .ToTable("ReceipeCategory") ); 

您可以定义您的类模型(第三个表将生成,但不需要特定模型)

class Recipe {.... public virtual ICollection<Category> Categories { get; set; }
class Category {... public virtual ICollection<Recipe> Recipes { get; set; } }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM