EF Core 在插入时发送 PK 值

EF Core sending PK value on Insert

我收到一个错误:

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

生成的SQL是:

INSERT INTO [ScheduleTransactionLink] ([Id], [CreatedByUserId], [CreatedDate], [Deleted], [LastUpdateDate], [LastUpdatedByUserId], [PaymentNumber], [ScheduleId])
VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7);`

很明显,问题与传递 Id 值有关,我要继续 IDENTITY INSERT。但我没有发送 Id。

我的table定义为:

internal class ScheduleTransactionLink : EntityAudit
{
    [Required, Key]
    public int Id { get; set; }

    [Required]
    public Schedule Schedule { get; set; }

    [Required]
    public Transaction Transaction { get; set; }

    [Required]
    public int PaymentNumber { get; set; }
}

和我所有的其他 table 一样。但是只有这段代码失败了。如我所见,生成的 SQL 正在发送 'Id'.

这只是在我向此 table 添加导航 属性 以在其他地方进行非常完整的查询后才开始发生。

  modelBuilder.Entity<Transaction>()
      .HasOne(x => x.ScheduleTransactionLink)
      .WithOne(t => t.Transaction)
      .HasForeignKey<ScheduleTransactionLink>();

此处是我如何保存实体的示例:

ScheduleTransactionLink link = new ScheduleTransactionLink
{
    CreatedByUserId = _jwt.UserId,
    CreatedDate = DateTime.UtcNow,
    PaymentNumber = paymentNumber,
    Schedule = schedule,
    Transaction = transaction
};

_context.ScheduleTransactionLink.Add(link);

var result = await _context.SaveChangesAsync();

SaveChangesAsync 出错的地方。

我也已将此代码添加到 OnModelCreating:

modelBuilder.Entity<ScheduleTransactionLink>(entity =>
{
    entity.Property(e => e.Id).UseIdentityColumn();
});

查看数据库,正确创建table:

CREATE TABLE [dbo].[ScheduleTransactionLink]
(
    [Id] [int] IDENTITY(1,1) NOT NULL,
    ....

如何阻止 EF 发送 PK 值?

我怀疑 EF 无法完全理解您的 1:1 实体之间的关系。看起来交易是主体,但我怀疑它试图通过将交易 ID 放入 ScheduleTransaction.Id 来建立关系 - 这本身就是一个独立的 PK,而不是交易 ID 的 FK。你可能需要通过做一些事情来帮助它:

internal class ScheduleTransactionLink : EntityAudit
{
    [ Key]
    public int Id { get; set; }

    [Required]
    public Schedule Schedule { get; set; }

    public int TransactionId { get; set; }
    [Required]
    public Transaction Transaction { get; set; }

    [Required]
    public int PaymentNumber { get; set; }
}
modelBuilder.Entity<Transaction>()
  .HasOne(x => x.ScheduleTransactionLink)
  .WithOne(t => t.Transaction)
  .HasForeignKey<ScheduleTransactionLink>(stl => stl.TransactionId);

不添加 TransactionId 可能有效,只是:

modelBuilder.Entity<Transaction>()
  .HasOne(x => x.ScheduleTransactionLink)
  .WithOne(t => t.Transaction)
  .HasForeignKey<ScheduleTransactionLink>(stl => stl.Transaction); 

..但这不是我来 across/can 测试 atm 和配置 1:1s 的文档确实有“int Id 属性 并在流畅”的方法。测试一下,如果它 works/doesn 不告诉我,我会修改答案