我用这种方式设置了official doc个对象,但得到了

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.

关于工作流类的Contalori属性

当我正确添加前台密钥时

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)
    );

推荐答案

问题是由UsingEntity配置引起的


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))

    );

请注意,在所有UsingEntity个重载中,首先是right个关系配置,然后是left个,最后是可选的联接实体本身.

在本例中,leftWorkflow(调用HasMany的那个),rightContatore(调用WithMany的那个),但流畅的配置正好相反.

所以只要换一换,问题就解决了

builder.HasMany(x => x.Contatori)
    .WithMany()
    .UsingEntity("NAT_DASH_WORKFLOW_CONTATORE_006",
        s => s.HasOne(typeof(Contatore)).WithMany().HasForeignKey("ID_CONTATORE_006").HasPrincipalKey(nameof(Contatore.Id)),
        m => m.HasOne(typeof(Workflow)).WithMany().HasForeignKey("ID_WORKFLOW_006").HasPrincipalKey(nameof(Workflow.Id))
    );

还可以考虑对所示的其他多对多关系执行相同的操作.因为虽然它不会产生错误,但集合导航属性(及其内容)的含义将与预期的完全相反.

Csharp相关问答推荐

.NET将复杂的Dto序列化为SON字符串

C#中的多yield 机制

如何从C#中有类.x和类.y的类列表中映射List(字符串x,字符串y)?

FromServices不使用WebAppliationFactory程序>

ASP.NET Core -是否可以对所有最小API端点应用过滤器?

我可以 suppress 规则CS 9035一次吗?

什么是通过反射创建类的泛型接口方法的正确方法?

读取配置文件(mytest. exe. config)

从Blob存储中提取tar.gz文件并将提取结果上载到另一个Blob存储

C#XmlSerializer-输出控制新行的多个XML片段

MigraDoc文档

当用户右键单击文本框并单击粘贴时触发什么事件?

在.NET MAUI.NET 8中如何防止按钮点击时出现灰色反馈

反序列化私有成员

为什么@rendermode Interactive Auto不能在.NET 8.0 Blazor中运行?

在两个已具有一对多关系的表之间添加另一个一对多关系

Google OAuth令牌交换在.Net中不起作用

在使用UserManager时,如何包含与其他实体的关系?

如何使用.NET Aspire从Blazor应用程序与GRPC API通信?

从MudAutoComplete打开对话框,列表仍然可见