【问题标题】:Entity Framework Code first self referencing ID inserts wrong entity实体框架代码第一个自引用 ID 插入错误的实体
【发布时间】:2018-05-01 22:22:51
【问题描述】:

我无法先使用 EF Core 2.0 插入包含代码的表。

打电话给我的context.SaveChanges()时遇到这个异常

Cannot insert explicit value for identity column in table 'Departments' when IDENTITY_INSERT is set to OFF.

这是我的模型:

public class Department 
{
  public int ID { get; set; }
  public string Name { get; set; }
  public int? ParentDepartmentID { get; set; }
  public Department ParentDepartment { get; set; }
}

当我使用 SQL Server Profiler 时,我可以看到对象的插入语句如下所示:

显然是在尝试再次插入我的 ParentDepartment。

exec sp_executesql N'SET NOCOUNT ON;
INSERT INTO [Departments] ([ID], [Name], [ParentDepartmentID])
VALUES (@p0, @p1, @p2);
',N'@p0 int,@p1 nvarchar(4000),@p2 int',@p0=1,@p1=N'Aalborg',@p2=NULL

我保存上面显示的对象的保存函数如下所示:

public string Save()
{
  string result = this.Validate();

  if (result.Equals(""))
  {
    using (LinerContext context = new LinerContext())
    {
      context.Departments.Add(this);
      context.SaveChanges();
    }
  }
  return result;
}

真的希望有人可以提供帮助 - 在此先感谢!

【问题讨论】:

  • 从您的屏幕截图看来,您的主要对象的 id 设置为 (-2147482647)。你将它初始化为最小值还是什么?
  • 不,我没有猜到这是默认的 int 值? ,我应该删除该属性上的设置器吗?
  • 您保存数据的方式似乎存在问题。在您调用 context.Departments.Add 之前,ID 是否设置为那个大的 -ve 数字?
  • 不确定,明天早上会跟进@smit
  • 不,调用context.departments.Add()之前ID为0

标签: entity-framework ef-code-first entity-framework-core


【解决方案1】:

您需要的可能是更改设置模型的方式。对于自引用,您可能应该这样做(也可以参考 this answer 以了解有关模型创建的 Fluent API 实现):

public class Department 
{
    public int ID { get;set; }
    public string Name { get;set; }
    public int? ParentDeparmentId { get; set; }

    [ForeignKey("ParentDeparmentId ")]
    public Department ParentDeparment { get; set; }
}

【讨论】:

  • 我试过没有用,完全一样的场景。我无法计算删除数据库并使用其他迁移重新创建所有不同风格的 DataAnnotations 和流式 API 的次数
【解决方案2】:

固定;我只需要将 parentdepartment 附加到 dbset

【讨论】:

    猜你喜欢
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    相关资源
    最近更新 更多