5 回答
TA贡献1818条经验 获得超7个赞
该错误表明您无法在 IDENTITY 列上插入数据,因为这样做已被禁用。
您可以通过执行以下操作来启用此行为
SET IDENTITY_INSERT [ [ database_name . ] schema_name . ] table_name { ON | OFF }
当您使用实体框架核心时,您必须:
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.DestuffedContainer ON");
context.SaveChanges();
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.DestuffedContainer OFF");
> SQL Server IDENTITY 列中的显式值
编辑我很抱歉我无法理解您没有提供价值。
然后确保您的列被标记为模型的 IDENTITY。我看到您正在使用属性来告诉 efcore 如何命名您的表。只要您不使用Id关键属性的常规名称,您就需要在实体类上使用[Key]属性来明确它,在属性之上,例如:
[Key]
public long DestuffedContainerId { get; set; }
或者在上下文类中使用 FluentAPI:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
...
modelBuilder
.Entity<DestuffedContainer>()
.Property(d => d.DestuffedContainerId)
.ValueGeneratedOnAdd()
modelBuilder
.Entity<DestuffedContainer>()
.HasKey(d => d.DestuffedContainerId)
...
}
还要检查 sql server 表定义并确保以您的属性命名的字段设置为IDENTITY,考虑到您收到的错误,这是肯定的,但值得检查。
TA贡献1810条经验 获得超5个赞
对于未来的读者。
我遇到了相反的问题。我不希望 IDENTITY 自动开启。
所以像这样:(非常简单的流畅映射)
builder.HasKey(ent => ent.MyColumnWhichIsTheKey);
我必须添加这一行(ValueGenerateNever)以保持 IDENITY 处于关闭状态(故意“关闭”):
builder.HasKey(ent => ent.MyColumnWhichIsTheKey); builder.Property(ent => ent.MyColumnWhichIsTheKey).ValueGeneratedNever();
其他提示:
using Microsoft.EntityFrameworkCore;using Microsoft.EntityFrameworkCore.Metadata.Builders;
和
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.3" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.3" />
TA贡献1998条经验 获得超6个赞
以防万一有人在 2021 年使用 EF Core 5.x 发现这个问题,我为此苦苦挣扎了几个小时,经过大量搜索后没有找到我的解决方案。
就我而言,我有一个现有数据库,并使用 EF Core 脚手架命令为我创建数据库上下文和关联的模型类。当尝试将新的 TimeEntry 插入数据库中的 TimeEntry 表时,如下所示:
TimeEntry timeEntry = new TimeEntry
{
EmployeeId = Emp.Id,
ScheduleTypeId = SchedTypeId,
FacilityId = FacilityId,
DateTimeIn1 = DateTimeIn1,
DateTimeIn2 = DateTimeIn2,
DateTimeIn3 = DateTimeIn3,
DateTimeIn4 = DateTimeIn4,
DateTimeIn5 = DateTimeIn5,
DateTimeIn6 = DateTimeIn6,
DateTimeIn7 = DateTimeIn7,
DateTimeOut1 = DateTimeOut1,
DateTimeOut2 = DateTimeOut2,
DateTimeOut3 = DateTimeOut3,
DateTimeOut4 = DateTimeOut4,
DateTimeOut5 = DateTimeOut5,
DateTimeOut6 = DateTimeOut6,
DateTimeOut7 = DateTimeOut7,
Day1TotalHours = day1TotalHoursDecimal,
Day2TotalHours = day2TotalHoursDecimal,
Day3TotalHours = day3TotalHoursDecimal,
Day4TotalHours = day4TotalHoursDecimal,
Day5TotalHours = day5TotalHoursDecimal,
Day6TotalHours = day6TotalHoursDecimal,
Day7TotalHours = day7TotalHoursDecimal,
WeekStartDate = StartDateForWeek,
WeekTotalHours = WeekTotalHoursDecimal
};
db.TimeEntries.Add(timeEntry);
db.SaveChanges();
尽管我没有明确尝试插入 ID,但我还是收到了此错误。经过多次尝试,我终于找到了解决方法,尝试了我能找到的每一篇文章中的所有内容,但没有任何效果。此代码解决了我的 DbContext 类中 id 字段的问题:
modelBuilder.Entity<TimeEntry>(entity =>
{
entity.ToTable("TimeEntry");
entity.Property(e => e.Id).HasColumnName("id").ValueGeneratedOnAdd(); // <-- This fixed it for me
另请注意,在其他帖子之后,我也在我的 TimeEntry 模型类中进行了此设置,不确定是否重要以避免此错误:
public partial class TimeEntry
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int Id { get; set; } // rest of code removed for brevity
我真的希望这对未来的人有所帮助,这让我发疯。
TA贡献1836条经验 获得超5个赞
有时,当开发人员在 Context 中手动创建 modelBuilder 时,他/她可能会编写这样的代码,并且准确地 .ValueGenerateNever() -这部分返回您主题中的错误
entity.Property(e => e.Id).ValueGeneratedNever();
TA贡献1804条经验 获得超2个赞
如果您想保持 Identity_Insert 关闭并允许在定义的应用程序上下文上的 OnModelCreating 方法中手动插入,则这是一个比所选答案更好的解决方案
这是使用 EF Core for NET 5.0
modelBuilder.Entity<EntityType>().HasKey(x => x.KeyWithIdentityValue); modelBuilder.Entity<EntityType>().Property(x => x.KeyWithIdentityValue).ValueGeneratedOnAdd();```
- 5 回答
- 0 关注
- 202 浏览
添加回答
举报