首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实体框架核心5-具有递归结构的错误

实体框架核心5-具有递归结构的错误
EN

Stack Overflow用户
提问于 2021-01-23 22:11:03
回答 2查看 202关注 0票数 0

我正在尝试设置一个实体框架类,该类有4个字段,这些字段链接到相同类型的其他字段或为null。我的课是这样的:

代码语言:javascript
运行
复制
public class Patch : EntityBase
{
    [Key]
    public int PatchId { get; set; }

    [ForeignKey("NorthPatchId")]
    public virtual Patch NorthPatch { get; set; }

    [ForeignKey("SouthPatchId")]
    public virtual Patch SouthPatch { get; set; }

    [ForeignKey("EastPatchId")]
    public virtual Patch EastPatch { get; set; }

    [ForeignKey("WestPatchId")]
    public virtual Patch WestPatch { get; set; }
}

如果我只有NorthPatch和SouthPatch,这很好,但是当我添加第三个EastPatch时,我在尝试迁移时得到以下错误:

System.InvalidOperationException: Unable to determine the relationship represented by navigation 'Patch.NorthPatch' of type 'Patch'.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-23 23:51:26

那是个很酷的虫子!我能够复制,并作为一个额外的发现,错误报告,仍然开放的EF核心。

Open: https://github.com/dotnet/efcore/issues/21968

类似问题: Entity Framework Core One-One Self Referencing Relationship fails

解决方案:移除ForeignKey属性,并将以下内容用于您的上下文中的OnModelConfiguring。

代码语言:javascript
运行
复制
builder.Entity<Patch>()
    .HasOne(x => x.NorthPatch)
    .WithOne()
    .HasForeignKey(typeof(Patch), "NorthPatchId");

builder.Entity<Patch>()
    .HasOne(x => x.SouthPatch)
    .WithOne()
    .HasForeignKey(typeof(Patch), "SouthPatchId");

builder.Entity<Patch>()
    .HasOne(x => x.EastPatch)
    .WithOne()
    .HasForeignKey(typeof(Patch), "EastPatchId");

builder.Entity<Patch>()
    .HasOne(x => x.WestPatch)
    .WithOne()
    .HasForeignKey(typeof(Patch), "WestPatchId");
票数 1
EN

Stack Overflow用户

发布于 2021-01-24 00:46:31

@Lucutah在我写的时候回答了这个问题,但是我想发布另一个我认为值得一看的解决方案。它有类似的结果,但也将自动保持东西和南北条目之间的关系。不过,根据你想要做的事情,这不太像表演家。

代码语言:javascript
运行
复制
public class Patch : EntityBase
{
    public int PatchId { get; set; }
    public virtual Patch NorthPatch { get; set; }
    public virtual Patch SouthPatch { get; set; }
    public virtual Patch EastPatch { get; set; }
    public virtual Patch WestPatch { get; set; }
}

在上下文中。

代码语言:javascript
运行
复制
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Patch>().HasKey("PatchId");

        modelBuilder.Entity<Patch>()
           .HasOne(x => x.NorthPatch)
           .WithOne(x => x.SouthPatch)
           .HasForeignKey(typeof(Patch), "NorthPatchId");
        modelBuilder.Entity<Patch>()
           .HasOne(x => x.EastPatch)
           .WithOne(x => x.WestPatch)
           .HasForeignKey(typeof(Patch), "EastPatchId");
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65864962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档