C# 从属角色和主体角色中的代码第一外键错误
我已经阅读了其他关于这个的帖子一段时间了,但仍然有一些不合理的地方。制作一个包含这两个类的MVC应用程序C# 从属角色和主体角色中的代码第一外键错误,c#,mysql,entity-framework,ef-code-first,C#,Mysql,Entity Framework,Ef Code First,我已经阅读了其他关于这个的帖子一段时间了,但仍然有一些不合理的地方。制作一个包含这两个类的MVC应用程序 public class ChecklistFilled { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int InternalChecklistFilledID { get; set; } public DateTime ChecklistFille
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; }
}
public类ChecklistFilled
{
[关键]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int InternalChecklistFilledID{get;set;}
public DateTime ChecklistFilledDate{get;set;}
public int PersonnelID{get;set;}
[外籍钥匙(“人员”)]
公共虚拟人员{get;set;}
公共int设备ID{get;set;}
[外键(“设备ID”)]
公共虚拟ICollection设备{get;set;}
公共虚拟项填充项填充{get;set;}
}
公共类项目已填充
{
[关键]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int InternalItemsFilledID{get;set;}
公共布尔?设备条件{get;set;}
公共int设备ID{get;set;}
[外键(“设备ID”)]
公共虚拟设备{get;set;}
public int ChecklistFilledID{get;set;}
[ForeignKey(“ChecklistFilledID”)]
公共虚拟ICollection 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);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasRequired(x=>x.ChecklistFilled)
.有很多
.Map(x=>x.MapKey(“ChecklistFilledID”);
基于模型创建(modelBuilder);
}
到目前为止,我已经发现很多帖子都有针对程序员问题的解决方案,但是没有一篇文章足够直截了当地让我作为一个新的开发人员应用到这里。从DBContext设置中我看到,我让它根据需要将外键从ChecklistFilled类映射到ItemsFilled类,但是当我运行enablemigrations命令时,我得到了错误
ItemsFilled_Device_Target_ItemsFilled_Device_Source::关系约束中从属角色和主体角色中的属性数必须相同
从表面上看,它试图告诉我每个类中必须有相同数量的属性——这听起来很荒谬。因此,我不确定我需要做什么来解决这个问题,并将ChecklistID作为FK放入ItemsFilled表中。如果我理解正确,您需要的是一种关系,其中一个清单与一个项目列表相关,一个项目与一个清单相关 要实现这种一对多关系,您应该重新定义实体中的属性,如下所示:
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; }
}
也许你应该考虑重命名你的实体,名字有点混乱,特别是当多元化来组成表名时。我建议
FilledCheckList
和FilledItem
此外,您得到的错误表明有问题的关系是
ItemsFilled\u Device\u Target\u ItemsFilled\u Device\u Source
。它是关于设备
和项目填充
。您的代码似乎在导致问题的设备
实体中包含了一些注释或映射 填写的项目和填写的检查列表之间有什么关系?您想尝试实现一对多吗?一个ItemsFilled可以有多个ChecklistFilled?一个ChecklistFilled可以有多个ItemsFilled,但是一个ItemsFilled不能有多个ChecklistFilled。ChecklistFilled是整个检查表,它由许多需要“勾选”的项目组成,但我需要的是ChecklistFilledID是ItemsFilled表中的外键,以引用一组项目与哪个检查表关联。我不理解ItemsFilled表中的ChecklistFilledID。ItemsFilled表将包含许多ChecklistFilled项。这意味着它将始终与多个关联,而不是与单个ChecklistFilledID关联。因此,我认为您不需要在ItemsFilled中使用CheckListFilleId。无论如何,我成功地根据您的代码首先从代码创建了DB。我删除了人员和设备,因为我没有这些类。因此,FK关系背后的想法是,ItemsFilled表将有一个长长的项目列表,随着时间的推移,这些项目已从许多不同的检查列表中勾选出来。当您想查看和查看哪些检查表是用哪些项目完成的时,您可以查询ItemsFilledId与您感兴趣的ChecklistFilledID匹配的ItemsFilledTable
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);