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

时间:2015-03-29 13:56:48

标签: c# asp.net asp.net-mvc entity-framework-6

我一直试图解决这个问题一段时间,但找不到对我有意义的答案。这个概念非常普遍,所以我必须完全误解一个基本概念。 如果我有一个可以在许多食谱类别中找到的食谱类,那么我有;

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 | CategoryID

我尝试使用外键和导航属性的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。

很抱歉这篇长篇文章,但您需要了解所有细节。

2 个答案:

答案 0 :(得分:0)

问题是你的分类模型。您目前定义它的方式,您在类别和食谱之间有一对多的关系(食谱可以有很多类别,但第一类只有一个食谱)。你想要的是一个多对多的关系,所以把一个Recipes集合放在Category上,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; }
}

答案 1 :(得分:0)

当你想要实现时,我没有得到实际情况。

当你提到你的模型然后你所期望的都是矛盾的。根据你的提到你有食谱和类别(一对多)但后来你改变你的模型,并提到你想要的(多对多)所以你需要连接表。作为关系模型,您可以在EF中处理两种方式。第一个没有创建单独的表并保持集合映射到每个模型和第二种方式创建单独的表并明确映射在您的模型中。你需要在模型构建时明确指定。

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