EntityTypeConfiguration验证错误

时间:2014-10-31 22:51:03

标签: c# sql asp.net sql-server entity-framework

我在映射这些实体时遇到了问题。我对此有些新意,所以我不确定我在哪里弄乱。任何建议或帮助将不胜感激。

这是错误: 在模型生成期间检测到一个或多个验证错误:

Recipe_RecipeIngredients_Source ::多重性在角色' Recipe_RecipeIngredients_Source'中无效。在关系&Recipe_RecipeIngredients'。由于“从属角色”是指关键属性,因此“从属角色”的多重性的上限必须为“' 1”。

这是我有两张桌子的图表

recipe

我的映射代码如下:

public class RecipeMap : EntityTypeConfiguration<Recipe>
{
    public RecipeMap()
    {
        HasKey(g => g.RecipeId);
        ToTable("recipes");
        Property(g => g.RecipeId).HasColumnName("RecipeId");
        Property(g => g.Title).HasColumnName("Title");
        Property(g => g.Description).HasColumnName("Description");
        Property(g => g.IsOnMenu).HasColumnName("IsOnMenu");
        Property(g => g.Url).HasColumnName("Url");
        Property(g => g.ImagePath).HasColumnName("ImagePath");
        Property(g => g.Calories).HasColumnName("Calories");
        Property(g => g.Servings).HasColumnName("Servings");
        Property(g => g.TotalTime).HasColumnName("TotalTime");
        Property(g => g.PrepTime).HasColumnName("PrepTime");
        Property(g => g.CookTime).HasColumnName("CookTime");
        this.HasRequired(g => g.RecipeIngredients).WithMany().HasForeignKey(x => x.RecipeId);

    }
}

public class RecipeIngredientMap : EntityTypeConfiguration<RecipeIngredient>
{
    public RecipeIngredientMap()
    {
        HasKey(g => g.IngredientId);
        ToTable("recipeIngredient");
        Property(g => g.RecipeId).HasColumnName("RecipeId").IsRequired();
        Property(g => g.IngredientName).HasColumnName("IngredientName");
        Property(g => g.Quantity).HasColumnName("Quantity");
        Property(g => g.Category).HasColumnName("Category");
        Property(g => g.IsOnMenu).HasColumnName("IsOnMenu");
        //this.HasRequired(g => g.Recipe);
    }
}

 public class RecipeContext : DbContext
{
    public virtual DbSet<RecipeIngredient> RecipeIngredients { get; set; }
    public virtual DbSet<Recipe> Recipes { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new RecipeMap());
        modelBuilder.Configurations.Add(new RecipeIngredientMap());
    }
}

2 个答案:

答案 0 :(得分:1)

One Recipe有多种成分,因为它似乎暗示了映射中的错误关系。

从RecipeMap()中删除hasRequired并将以下内容添加到RecipeIngredientMap()

 this.HasRequired(g => g.Recipes)
.WithMany(y => y.RecipesIngredient)
.HasForeignKey(x => x.RecipeId);

答案 1 :(得分:1)

我暂时没有使用Entity Framework,所以这可能不是严格正确的。

我假设您的课程看起来像这样:

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

    // Other code

    // Navigation property
    public virtual ICollection<RecipeIngredient> Ingredients { get; set; }
}

public class RecipeIngredient
{
    public int ID { get; set; }
    public int RecipeID { get; set; }
    // Other code
}

我认为您尝试描述的关系(我可能不正确)是Recipe有很多Ingredients,所以我会在RecipeMap中尝试这一点(使用你自己的财产名称):

this.HasMany(x => x.Ingredients) // A Recipe has many ingredients.
    .WithRequired() // Ingredient requires a recipe.
    .HasForeignKey(x => x.RecipeID); // Our Foreign Key on Ingredient.

稍微说,看起来你的数据模型可以通过引入一个结点/链接表来进一步标准化,例如RecipeIngredients(或转换你已经拥有的表),包含字段RecipeIDIngredientIDQuantity

然后,您可以将与Ingredient特定相关的所有字段提取到Ingredients表中,并保存一些成分数据重复。