我有三种多到多的关系像这样:
table 1 skill
table 2 instructions
table 3 person现在,我需要有一种方法来设置一个技能和人的组合,一个指令列表。我正在考虑有一个表,它具有这个映射SkillId、InstructionId和PersonId。我试过用HasOne.Withmany.HasForeignKey来设置它,但它不起作用。我搞错了
属性或导航“指令”不能添加到实体类型'PersonSkillInstruction‘中,因为实体类型'PersonSkillInstruction’上已经存在相同名称的属性或导航
如果我只设置主键,并让.netcore 5.0为我做这个技巧,我将得到另一个错误
属性“PersonSkillInstruction.Instruction”类型为“InstructionEntity”,当前数据库提供程序不支持该类型。要么更改属性CLR类型,要么使用“NotMapped”属性忽略该属性,或者在“OnModelCreating”中使用“EntityTypeBuilder.Ignore”
我知道我可以做一些事情,比如为个人和技能创造很多人,然后设置一个id,然后将其与指导结合使用,但感觉很可疑。
我怎样才能使这三种方式多到多的工作?
我使用的是.netcore 5.0,ef核心,代码优先和sqlserver
发布于 2021-12-05 14:58:00
我认为你所说的是正确的:
,我知道我可以做一些事情,比如为个人和技能创建很多人,然后设置一个id,然后将其与指导结合使用。
不过,这里有一个示例,如果您想创建PersonSkillInstruction表的话。
public class PersonSkillInstruction
{
[ForeignKey("person")]
public int PersonId { get; set; }
[ForeignKey("skill")]
public int SkillId { get; set; }
[ForeignKey("instructions")]
public int InstructionId { get; set; }
public virtual Person Person { get; set; }
public virtual Skill Skill { get; set; }
public virtual Instruction Instruction { get; set; }
}然后,您需要在DBContext中设置PK,如下所示:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// ...
modelBuilder.Entity<PersonSkillInstruction>()
.HasKey(t => new { t.PersonId, t.SkillId, t.InstructionId });
// ...添加新迁移后,您必须引用两个类似的操作,以避免循环:
// ...
onDelete: ReferentialAction.Restrict
// ...如果这个表的查询量很大,我建议使用一个具有以下唯一索引的代理键:
modelBuilder.Entity<PersonSkillInstruction>()
.HasIndex(t => new { t.PersonId, t.SkillId, t.InstructionId })
.IsUnique(); https://stackoverflow.com/questions/70234407
复制相似问题