集合和集合中特定项目的 EF Core 导航属性

问题描述 投票:0回答:1

我有一个主 EF 实体类,它具有到另一个 EF 实体类集合的导航属性,具有一对多关系。第二个实体具有 DateCreated 属性和以一对一关系返回主类的导航引用

enter code here

出于性能原因,我想在主类中添加另一个导航属性到类集合中最新的相关条目,但遇到了很多有关外键的问题。

public class MainClass
{
   public virtual List<OtherClass> OtherClasses { get; set;}
   public virtual OtherClass LatestOtherClass { get; set; }
}

public class OtherClass
{
   public virtual MainClass { get; set;}
   public virtual DateTime DateCreated { get; set;}
}

我收到的错误是“无法确定“OtherClass”类型的“MainClass.LatestOtherClass”导航所表示的关系。 建议我手动配置关系,但到目前为止,我一直无法找到一种方法来成功执行此操作,而不会导致 DbContext 错误或破坏相反方向的关系。

这可能吗?如果可以,我该如何配置?

如果这有任何后果的话,这是针对 Postgresql 数据库的。

c# postgresql entity-framework .net-core
1个回答
0
投票

我认为下面的代码将有助于解决您的问题。

public class MainClass
{
    public int Id { get; set; } // Primary Key for EF

    public virtual List<OtherClass> OtherClasses { get; set; }

    public int? LatestOtherClassId { get; set; } // Foreign Key to OtherClass
    public virtual OtherClass LatestOtherClass { get; set; }
}

public class OtherClass
{
    public int Id { get; set; } // Primary Key for EF

    public int MainClassId { get; set; } // Foreign Key to MainClass
    public virtual MainClass MainClass { get; set; }

    public DateTime DateCreated { get; set; }
}

public class MyDbContext : DbContext
{
    public DbSet<MainClass> MainClasses { get; set; }
    public DbSet<OtherClass> OtherClasses { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // Configure one-to-many relationship between MainClass and OtherClass
        modelBuilder.Entity<MainClass>()
            .HasMany(m => m.OtherClasses)
            .WithOne(o => o.MainClass)
            .HasForeignKey(o => o.MainClassId);

        // Configure self-referencing LatestOtherClass as an optional relationship
        modelBuilder.Entity<MainClass>()
            .HasOne(m => m.LatestOtherClass)
            .WithMany() // No navigation back to MainClass from this side
            .HasForeignKey(m => m.LatestOtherClassId)
            .IsRequired(false);

        base.OnModelCreating(modelBuilder);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.