[英]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.