现在已经阅读了其他SO帖子一段时间了,现在还有一些不合理的事情。制作包含这两个类的MVC应用程序
public class ChecklistFilled
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int InternalChecklistFilledID { get; set; }
public DateTime ChecklistFilledDate { get; set; }
public int PersonnelID { get; set; }
[ForeignKey("PersonnelID")]
public virtual Personnel Personnel { get; set; }
public int EquipmentID { get; set; }
[ForeignKey("EquipmentID")]
public virtual ICollection<Equipment> Equipment { get; set; }
public virtual ItemsFilled ItemsFilled { get; set; }
}
public class ItemsFilled
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int InternalItemsFilledID { get; set; }
public bool? DeviceCondition { get; set; }
public int DeviceID { get; set; }
[ForeignKey("DeviceID")]
public virtual Device Device { get; set; }
public int ChecklistFilledID { get; set; }
[ForeignKey("ChecklistFilledID")]
public virtual ICollection<ChecklistFilled> ChecklistFilled { get; set; }
}
来自我的DBContext类的声明
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ItemsFilled>()
.HasRequired(x => x.ChecklistFilled)
.WithMany()
.Map(x => x.MapKey("ChecklistFilledID"));
base.OnModelCreating(modelBuilder);
}
到目前为止,我发现很多帖子都有解决方案,这些解决方案对于程序员的问题非常具体,而且对于我来说,作为一个新的开发人员,我没有什么是直截了当的。从我在DBContext设置中看到的,我将它根据需要从ChecklistFilled类映射到ItemsFilled类,但是当我运行enable-migrations命令时,我收到错误
ItemsFilled_Device_Target_ItemsFilled_Device_Source ::关系约束中的从属角色和主要角色中的属性数必须相同
从表面上看,它试图告诉我每个班级必须拥有相同数量的属性 - 这对我来说听起来很荒谬。所以我不确定我需要做些什么来解决这个问题,并将ChecklistID作为FK放入ItemsFilled表中
答案 0 :(得分:1)
如果我理解正确,你想要的是一个关系,其中一个清单与一个项目列表相关,一个项目与一个清单相关。
要实现这种一对多关系,您应该重新定义实体中的属性,如下所示:
public class ChecklistFilled
{
...
public virtual ICollection<ItemsFilled> ItemsFilled { get; set; }
}
public class ItemsFilled
{
...
public int CheckListFilledId { get; set; }
[ForeignKey("CheckListFilledId")]
public virtual ChecklistFilled ChecklistFilled { get; set; }
}
通过此更改,您甚至不需要OnModelInitialize
中的显式映射。实际上,您应该删除映射。
作为旁注,一般情况下,如果更好
base.OnModelCreating(modelBuilder);
行是该方法中的第一行。
迁移生成的表格如下所示(为清晰起见,我删除了一些不相关的属性):
CreateTable(
"dbo.ChecklistFilleds",
c => new
{
InternalChecklistFilledID = c.Int(nullable: false, identity: true),
ChecklistFilledDate = c.DateTime(nullable: false),
})
.PrimaryKey(t => t.InternalChecklistFilledID);
CreateTable(
"dbo.ItemsFilleds",
c => new
{
InternalItemsFilledID = c.Int(nullable: false, identity: true),
DeviceCondition = c.Boolean(),
CheckListFilledId = c.Int(nullable: false),
})
.PrimaryKey(t => t.InternalItemsFilledID)
.ForeignKey("dbo.ChecklistFilleds", t => t.CheckListFilledId, cascadeDelete: true)
.Index(t => t.CheckListFilledId);
也许您应该考虑重命名您的实体,这些名称有点令人困惑,特别是在复数形式组成表名时。我建议FilledCheckList
和FilledItem
。
此外,您得到的错误表明问题关系为ItemsFilled_Device_Target_ItemsFilled_Device_Source
。大概是Devices
和ItemsFilled
。您的代码似乎包含导致问题的Device
实体中的一些注释或映射。