在我们的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; }
}
我们需要从WeekDay
到Shop
的一对一关系,反过来(这样每个商店都有工作日,反之亦然)。不幸的是,上面的代码给出了以下错误:
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
我的数据库结构如下所示:
现在我通过不仅仅采用一种方式“解决”了这个问题,以便将WillCascadeOnDelete
与Shop
相匹配,我需要查询{{1}首先是表,然后查看哪个商店匹配。然后,我可以在进一步查询中使用WeekDay
,仅从当前商店中选择WeekDay
。如果您可以从ShopId
转到Categories
,那么我会更加清洁,这样我只需要查询一次。
如果难以制作,我不在乎它是否是一对一(我将只使用众多中的一个),但它应该是另一种方式(从商店到工作日而不是工作日购物)。从右上角可以看出,一对多是错误的方式。
答案 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);