实体框架中的一对一关系表明Multiplicity无效

时间:2013-12-18 14:42:20

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

在我们的MVC4应用程序中,我们有一个WeekDay模型:

public class WeekDay
{
    [Key]
    public int WeekDayId { get; set; } 
    [Required]
    [Display(Name = "Dag")]
    public string Day { get; set; }

    [ForeignKey("Shop")]
    public int ShopId { get; set; }
    public virtual Shop Shop { get; set; }
}

Shop模型:

public class Shop
{
    public int ShopId { get; set; }

    [Display(Name = "Winkel")]
    public string Name { get; set; }

    public int WeekDayId { get; set; }
    public virtual WeekDay WeekDay { get; set; }

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

我们需要从WeekDayShop的一对一关系,反过来(这样每个商店都有工作日,反之亦然)。不幸的是,上面的代码给出了以下错误:

Multiplicity is not valid in Role 'Shop_WeekDay_Target' in relationship 'Shop_WeekDay'. Because 
the Dependent Role properties are not the key properties, the upper bound of the multiplicity of 
the Dependent Role must be '*'.

我们尝试过在互联网上找到的各种东西来解决这个问题,但似乎都没有用(当我们添加两个主键时它确实构建了,但是在运行种子方法时失败了,我们得到了这个错误:{{ 1}})。

有谁知道在这种情况下如何建立一对一的关系?

/编辑添加:

The index 'IX_ShopId' is dependent on column 'ShopId'.
ALTER TABLE ALTER COLUMN ShopId failed because one or more objects access this column.

modelBuilder.Entity<WeekDay>() .HasRequired(a => a.Shop) .WithMany() .HasForeignKey(u => u.ShopId); modelBuilder.Entity<Shop>() .HasRequired(a => a.WeekDay) .WithMany() .HasForeignKey(u => u.WeekDayId); 成功迁移,但在DbContext上会出错:

  

介绍FOREIGN KEY约束'FK_dbo.WeekDays_dbo.Shops_ShopId'   在表'WeekDays'可能会导致周期或多个级联路径。   指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他   FOREIGN KEY约束。无法创建约束。见前   错误。

update-database设置为false会出现错误:

  

索引'IX_ShopId'依赖于列'ShopId'。更改表   ALTER COLUMN ShopId失败,因为一个或多个对象访问它   列。

/编辑3

我的数据库结构如下所示:

Like this

现在我通过不仅仅采用一种方式“解决”了这个问题,以便将WillCascadeOnDeleteShop相匹配,我需要查询{{1}首先是表,然后查看哪个商店匹配。然后,我可以在进一步查询中使用WeekDay,仅从当前商店中选择WeekDay。如果您可以从ShopId转到Categories,那么我会更加清洁,这样我只需要查询一次。

如果难以制作,我不在乎它是否是一对一(我将只使用众多中的一个),但它应该是另一种方式(从商店到工作日而不是工作日购物)。从右上角可以看出,一对多是错误的方式。

1 个答案:

答案 0 :(得分:0)

我注意到的第一个问题是:

 modelBuilder.Entity<WeekDay>()
         .HasRequired(a => a.Shop)
         .WithMany()
         .HasForeignKey(u => u.ShopId);

    modelBuilder.Entity<Shop>()
                .HasRequired(a => a.WeekDay)
                .WithMany()
                .HasForeignKey(u => u.WeekDayId);

上述每个配置都定义了一对多的关系。如果你想要一对一的关系,它应该看起来像这样(检查我的语法,因为我不在我的开发工作站验证):

 modelBuilder.Entity<WeekDay>()
         .HasRequired(a => a.Shop)
         .WithRequiredDependent();

或者,您也可以这样做:

 modelBuilder.Entity<WeekDay>()
         .HasRequired(a => a.Shop);

    modelBuilder.Entity<Shop>()
                .HasRequired(a => a.WeekDay);