【问题标题】:EF 7 : INSERT statement conflicted with the FOREIGN KEY SAME TABLEEF 7:INSERT 语句与 FOREIGN KEY SAME TABLE 冲突
【发布时间】:2016-05-01 23:19:58
【问题描述】:

当我调用 SaveChangesAsync 时出现异常。 我的架构非常简单,我有一个 Category 类,其中包含

public class Category {
  public Guid ID {get; set;}
  public Guid? ParentId {get; set;}
  public Category Parent {get; set;}
 [...]
}

当我想在数据库中插入一个新类别(连接到我的 ASP MVC 应用程序)时,我在插入之前设置了 GUID。 当我的数据库为空并且我想插入父类别时发生错误(因此使用 null Guid IdParent 和 null Parent)。如果我设置父值,则不会发生这种情况。我可以通过 Visual Studio 将 parent 设置为 Null 来手动添加记录。

我有以下错误:

INSERT 语句与 FOREIGN KEY SAME TABLE 冲突 约束“FK_Category_Category_ParentId”。冲突发生在 数据库“HT_Root”,表“dbo.Category”,列“ID”。该声明 已终止。

我在堆栈溢出上搜索了一个简单的答案,但没有找到。 我尝试使用 Fluent API:

modelBuilder.Entity<Category>().HasOne(s => s.Parent).WithMany().HasForeignKey(s => s.ParentId);

但没有任何改变。我做错了什么?

【问题讨论】:

  • 你试过HasOptional而不是HasOne吗?
  • @SergeyKolodiy 我在 EF 7 流式 API 中没有任何 HasOptional ...?
  • 能否像使用 SSMS 一样在数据库中手动插入行?这听起来像您的数据库表设置不正确。
  • 我可以通过 Visual Studio 添加它是的
  • 不幸的是,是的,在我的数据库架构中,ParentId 是一个 FK,uniqueidentifier,Null

标签: c# sql-server asp.net-mvc entity-framework entity-framework-core


【解决方案1】:

似乎在 EF 7 See this github issue 中发生了变化

试试

public class Category 
{
    public Guid ID {get; set;}
    public Guid? ParentId {get; set;}
    public Category Parent {get; set;}
    public ICollection<Categories> Children {get; set;}
}

还有

modelBuilder.Entity<Category>()
    .HasOne(x => x.Parent)
    .WithMany(x => x.Children)
    .HasForeignKey(x => x.ParentId)
    .Required(false);

您还应该始终检查(如果指定)ParentId 是否存在于数据库中。注意添加 Guid.Empty (00000000-0000-0000-0000-000000000000) 而不是 null,因为这可能会导致问题。

【讨论】:

  • 您插入的记录是有还是没有父ID?
  • 它最初与父 ID 一起使用,但没有父 ID 时仍然无法使用
  • 所以您通过 http 发布了一些值,但它不起作用,但如果您在初始化程序中添加值,它会起作用吗?
  • 在这两种情况下,我都会通过 http 发布一些值
  • 有时您可以发布 Guid.Empty (00000000-0000-0000-0000-000000000000) 而不是 null - 您是否仔细检查过?
猜你喜欢
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-28
  • 1970-01-01
相关资源
最近更新 更多