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 不告诉我,我会修改答案
我收到一个错误:
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 不告诉我,我会修改答案