EF Core-无法为身份列SqlException

时间:2019-01-02 09:43:00

标签: asp.net-core entity-framework-core

在我的应用中,我使用EF Core定义了2个实体(代码优先),MeetingPostcodeDetail的定义如下:

public class Meeting
{
  public int Id { get; set;}
  public PostcodeDetail PostcodeDetail { get; set; }

  // other properties removed for brevity
}

public class PostcodeDetail
{
  public int Id { get; set; }
  public ICollection<Meeting> Meetings { get; set; } = new List<Meeting>();

  // other properties removed for brevity
}

当我创建新的Meeting并尝试按以下方式分配现有的PostcodeDetail实体时:

var meeting = new Meeting();
var details = context.PostcodeDetails
                        .SingleOrDefault(i => i.Prefix == prefix);

meeting.PostcodeDetail = details;
context.SaveChanges();

我收到此异常:

  

Microsoft.EntityFrameworkCore.DbUpdateException:SqlException:当IDENTITY_INSERT设置为OFF时,无法在表'PostcodeDetail'中为标识列插入显式值

当我从数据库中检索现有实体时,我看不到为什么在PostcodeDetail上执行插入语句-有人能在这里看到我在做什么吗?

编辑:运行SQL Server Profiler时,我可以看到以下内容已执行

  

在[PostcodeDetail]中插入([Id],[DateCreated],[DateModified],[District],[Prefix],[Region])   值(@ p0,@ p1,@ p2,@ p3,@ p4,@ p5);   ',N'@ p0 int,@ p1 datetime2(7),@ p2 datetime2(7),@ p3 nvarchar(4000),@ p4 nvarchar(4000),@ p5 nvarchar(4000)',@ p0 = 113,@ p1 ='2019-01-02 15:50:49.5874691',@ p2 ='2019-01-02 15:50:49.5874640',@ p3 = N'Guernsey',@ p4 = N'GY',@ p5 = N'Channel Islands'

我不知道为什么会生成插入,因为我正在从数据库中获取PostcodeDetail并在新的Meeting上引用它

2 个答案:

答案 0 :(得分:0)

可能是您试图将值显式分配给数据库自动为其分配值的列。 或者您在表上创建了非身份PK字段。您可以这样设置 enter image description here

或者您也可以使用身份字段来做到这一点:

[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }

答案 1 :(得分:0)

此问题的原因是,我在与创建实体所使用的上下文不同的上下文中调用SaveChanges