以下官方文档我以这种方式设置了我的对象,但得到了
OneTimeSetUp: System.InvalidOperationException : The skip navigation 'Contatore.Workflow1' doesn't have a foreign key associated with it. Every skip navigation must have a configured foreign key.
Workflow 类的 Contatori 属性
当我正确添加外键时
public class Workflow
{
public required int Id { get; set; }
public virtual ICollection<Contatore> Contatori { get; set; } = new HashSet<Contatore>();
}
public class Contatore
{
public override int Id { get; set; }
public virtual ICollection<Contatore> ContatoriFigli { get; set; } = new HashSet<Contatore>();
public virtual ICollection<Contatore> ContatoriPadri { get; set; } = new HashSet<Contatore>();
}
internal class ContatoreConfiguration : IEntityTypeConfiguration<Contatore>
{
public void Configure(EntityTypeBuilder<Contatore> builder)
{
builder
.ToTable($"NAT_{Costanti.CodiceApplicazione}_CONTATORE_003")
.HasKey(c => c.Id)
.HasName("NAK_DASH_003");
builder.Property(b => b.Id)
.HasColumnName("ID_003")
.HasComment("Chiave primaria")
.HasDefaultValueSql($"SYUNA{Costanti.CodiceApplicazione}.SEQ_{Costanti.CodiceApplicazione}_003.NEXTVAL");
builder.HasMany(x => x.ContatoriFigli)
.WithMany(x => x.ContatoriPadri)
.UsingEntity("NAT_DASH_CONTATORE_LINKS_004",
m => m.HasOne(typeof(Contatore)).WithMany().HasForeignKey("IdContatorePrincipale").HasPrincipalKey(nameof(Contatore.Id)),
s => s.HasOne(typeof(Contatore)).WithMany().HasForeignKey("IdContatoreCollegato").HasPrincipalKey(nameof(Contatore.Id)),
j => {
j.Property("IdContatorePrincipale").HasColumnName("ID_CONT_PRINC_004");
j.Property("IdContatoreCollegato").HasColumnName("ID_CONT_COLL_004");
j.HasKey("IdContatorePrincipale", "IdContatoreCollegato");
}
);
}
internal class WorkflowConfiguration : IEntityTypeConfiguration<Workflow>
{
public void Configure(EntityTypeBuilder<Workflow> builder)
{
builder
.ToTable($"NAT_DASH_WORKFLOW_005")
.HasKey(c => c.Id)
.HasName("NAK_DASH_005");
builder.Property(b => b.Id)
.HasColumnName("ID_005")
.HasComment("Chiave primaria")
.HasDefaultValueSql($"SYUNA{Costanti.CodiceApplicazione}.SEQ_{Costanti.CodiceApplicazione}_005.NEXTVAL");
builder.HasMany(x => x.Contatori)
.WithMany()
.UsingEntity("NAT_DASH_WORKFLOW_CONTATORE_006",
m => m.HasOne(typeof(Workflow)).WithMany().HasForeignKey("ID_WORKFLOW_006").HasPrincipalKey(nameof(Workflow.Id)),
s => s.HasOne(typeof(Contatore)).WithMany().HasForeignKey("ID_CONTATORE_006").HasPrincipalKey(nameof(Contatore.Id))
);
}
Oracle表:
CREATE TABLE "NAT_DASH_WORKFLOW_CONTATORE_006"
(
"ID_WORKFLOW_006" NUMBER (9,0),
"ID_CONTATORE_006" NUMBER (9,0),
CONSTRAINT NAF_DASH_006_004 FOREIGN KEY (ID_WORKFLOW_006) REFERENCES NAT_DASH_WORKFLOW_005 (ID_005),
CONSTRAINT NAF_DASH_006_005 FOREIGN KEY (ID_CONTATORE_006) REFERENCES NAT_DASH_CONTATORE_003 (ID_003)
);
好像对顺序比较敏感,将
Workflow
配置改为:
builder.HasMany(x => x.Contatori)
.WithMany()
.UsingEntity("NAT_DASH_WORKFLOW_CONTATORE_006",
s => s.HasOne(typeof(Contatore)).WithMany().HasForeignKey("ID_CONTATORE_006").HasPrincipalKey("Id"),
m => m.HasOne(typeof(Workflow)).WithMany().HasForeignKey("ID_WORKFLOW_006").HasPrincipalKey("Id")
);