5 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超7個(gè)贊
該錯(cuò)誤表明您無法在 IDENTITY 列上插入數(shù)據(jù),因?yàn)檫@樣做已被禁用。
您可以通過執(zhí)行以下操作來啟用此行為
SET IDENTITY_INSERT [ [ database_name . ] schema_name . ] table_name { ON | OFF }
當(dāng)您使用實(shí)體框架核心時(shí),您必須:
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.DestuffedContainer ON");
context.SaveChanges();
context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.DestuffedContainer OFF");
> SQL Server IDENTITY 列中的顯式值
編輯我很抱歉我無法理解您沒有提供價(jià)值。
然后確保您的列被標(biāo)記為模型的 IDENTITY。我看到您正在使用屬性來告訴 efcore 如何命名您的表。只要您不使用Id關(guān)鍵屬性的常規(guī)名稱,您就需要在實(shí)體類上使用[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 表定義并確保以您的屬性命名的字段設(shè)置為IDENTITY,考慮到您收到的錯(cuò)誤,這是肯定的,但值得檢查。

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超5個(gè)贊
對于未來的讀者。
我遇到了相反的問題。我不希望 IDENTITY 自動(dòng)開啟。
所以像這樣:(非常簡單的流暢映射)
????????builder.HasKey(ent?=>?ent.MyColumnWhichIsTheKey);
我必須添加這一行(ValueGenerateNever)以保持 IDENITY 處于關(guān)閉狀態(tài)(故意“關(guān)閉”):
????????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貢獻(xiàn)1998條經(jīng)驗(yàn) 獲得超6個(gè)贊
以防萬一有人在 2021 年使用 EF Core 5.x 發(fā)現(xiàn)這個(gè)問題,我為此苦苦掙扎了幾個(gè)小時(shí),經(jīng)過大量搜索后沒有找到我的解決方案。
就我而言,我有一個(gè)現(xiàn)有數(shù)據(jù)庫,并使用 EF Core 腳手架命令為我創(chuàng)建數(shù)據(jù)庫上下文和關(guān)聯(lián)的模型類。當(dāng)嘗試將新的 TimeEntry 插入數(shù)據(jù)庫中的 TimeEntry 表時(shí),如下所示:
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,但我還是收到了此錯(cuò)誤。經(jīng)過多次嘗試,我終于找到了解決方法,嘗試了我能找到的每一篇文章中的所有內(nèi)容,但沒有任何效果。此代碼解決了我的 DbContext 類中 id 字段的問題:
modelBuilder.Entity<TimeEntry>(entity =>
{
entity.ToTable("TimeEntry");
entity.Property(e => e.Id).HasColumnName("id").ValueGeneratedOnAdd(); // <-- This fixed it for me
另請注意,在其他帖子之后,我也在我的 TimeEntry 模型類中進(jìn)行了此設(shè)置,不確定是否重要以避免此錯(cuò)誤:
public partial class TimeEntry
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int Id { get; set; } // rest of code removed for brevity
我真的希望這對未來的人有所幫助,這讓我發(fā)瘋。

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超5個(gè)贊
有時(shí),當(dāng)開發(fā)人員在 Context 中手動(dòng)創(chuàng)建 modelBuilder 時(shí),他/她可能會(huì)編寫這樣的代碼,并且準(zhǔn)確地 .ValueGenerateNever() -這部分返回您主題中的錯(cuò)誤
entity.Property(e => e.Id).ValueGeneratedNever();

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊
如果您想保持 Identity_Insert 關(guān)閉并允許在定義的應(yīng)用程序上下文上的 OnModelCreating 方法中手動(dòng)插入,則這是一個(gè)比所選答案更好的解決方案
這是使用 EF Core for NET 5.0
modelBuilder.Entity<EntityType>().HasKey(x => x.KeyWithIdentityValue); modelBuilder.Entity<EntityType>().Property(x => x.KeyWithIdentityValue).ValueGeneratedOnAdd();```
- 5 回答
- 0 關(guān)注
- 246 瀏覽
添加回答
舉報(bào)