Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在entity Framework Core中添加具有多个一对一关系且具有相同表的实体时出现堆栈溢出_C#_Entity Framework_Asp.net Core_.net Core_Entity Framework Core - Fatal编程技术网

C# 在entity Framework Core中添加具有多个一对一关系且具有相同表的实体时出现堆栈溢出

C# 在entity Framework Core中添加具有多个一对一关系且具有相同表的实体时出现堆栈溢出,c#,entity-framework,asp.net-core,.net-core,entity-framework-core,C#,Entity Framework,Asp.net Core,.net Core,Entity Framework Core,在Entity Framework Core中添加具有多个一对一关系的实体时,我遇到了一个问题。基于这个问题,我有以下几点: public class Article { public int Id { get; set; } public int? PreviousId { get; set; } public Article Previous { get; set; } public int? NextId { get; set; } public A

在Entity Framework Core中添加具有多个一对一关系的实体时,我遇到了一个问题。基于这个问题,我有以下几点:

public class Article
{
    public int Id { get; set; }
    public int? PreviousId { get; set; }
    public Article Previous { get; set; }
    public int? NextId { get; set; }
    public Article Next { get; set; }
}
DbContext
OnModelCreating
中,如我所述:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.HasDefaultSchema("ab");
    modelBuilder.ApplyConfiguration(new ArticleEntityTypeConfiguration());
}

public class ArticleEntityTypeConfiguration : IEntityTypeConfiguration<Article>
{
    public void Configure(EntityTypeBuilder<Article> builder)
    {
        builder.ToTable("Articles");

        builder.HasKey(table => table.Id);
        builder.Property(table => table.Id).ValueGeneratedOnAdd();

        builder.HasOne(table => table.Previous).WithOne().HasForeignKey<Article>(table => table.PreviousId);
        builder.HasOne(table => table.Next).WithOne().HasForeignKey<Article>(table => table.NextId);
    }
}

你知道我怎样才能避免那个错误吗?谢谢

如果添加新文章,则
PreviousId/NextId
应为空或现有
article.Id
。如果您的article.Id增加,则PreviousId是现有记录的最大Id

以下是保存新文章的演示:

[HttpPost]
public async Task<IActionResult> Create(Article article)
{
    if (ModelState.IsValid)
    {
        int minArticleId = _context.Articles.Max(a => a.Id);
        var previous = await _context.Articles.Where(s => s.Id == minArticleId).FirstOrDefaultAsync();
        article.PreviousId = minArticleId;
        _context.Add(article);
        await _context.SaveChangesAsync();

        previous.NextId = article.Id;          
        _context.Update(previous);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }

    return View(article);
}
[HttpPost]
公共异步任务创建(文章)
{
if(ModelState.IsValid)
{
int minArticleId=\u context.Articles.Max(a=>a.Id);
var previous=await_context.Articles.Where(s=>s.Id==minArticleId.FirstOrDefaultAsync();
article.PreviousId=minArticleId;
_增加(第条);
wait_context.SaveChangesAsync();
previous.NextId=article.Id;
_更新(以前);
wait_context.SaveChangesAsync();
返回重定向到操作(名称(索引));
}
返回视图(文章);
}

所以我继续对此进行调查,并找到了帮助我解决问题的答案。诀窍是将
DbContext
OnModelCreating
更改为:

public void Configure(EntityTypeBuilder<Article> builder)
{
    builder.ToTable("Articles");

    builder.HasKey(table => table.Id);
    builder.Property(table => table.Id).ValueGeneratedOnAdd();

    builder
        .HasOne(table => table.Previous)
        .WithOne() // <-- one of this must be empty
        .HasForeignKey<Article>(table => table.PreviousId)
        .OnDelete(DeleteBehavior.Restrict);

    builder
        .HasOne(table => table.Next)
        .WithOne(table => table.Previous)
        .HasForeignKey<Article>(table => table.NextId);
}
public void配置(EntityTypeBuilder)
{
建筑商:可折叠(“物品”);
HasKey(table=>table.Id);
属性(table=>table.Id).ValueGeneratedOnAdd();
建设者
.HasOne(table=>table.Previous)
.WithOne()//表.PreviousId)
.OnDelete(DeleteBehavior.Restrict);
建设者
.HasOne(table=>table.Next)
.WithOne(table=>table.Previous)
.HasForeignKey(table=>table.NextId);
}

不确定这是否有用,但您尝试过吗?实际上导航不是这样的。存在多种线程,因此数据库中的min id不需要PreviousId。这就是为什么上一篇文章,或者至少上一篇文章id,必须是操作的输入。
public void Configure(EntityTypeBuilder<Article> builder)
{
    builder.ToTable("Articles");

    builder.HasKey(table => table.Id);
    builder.Property(table => table.Id).ValueGeneratedOnAdd();

    builder
        .HasOne(table => table.Previous)
        .WithOne() // <-- one of this must be empty
        .HasForeignKey<Article>(table => table.PreviousId)
        .OnDelete(DeleteBehavior.Restrict);

    builder
        .HasOne(table => table.Next)
        .WithOne(table => table.Previous)
        .HasForeignKey<Article>(table => table.NextId);
}