3 回答

TA貢獻(xiàn)1780條經(jīng)驗 獲得超1個贊
很奇怪。我所能建議的只是嘗試使 Id 屬性不是自動的,以通過查看調(diào)用堆棧來找出它的設(shè)置位置。
private int _id;
public int Id
{
get { return _id; }
set { _id = value; }
}
并使用“set”設(shè)置斷點(diǎn)

TA貢獻(xiàn)1801條經(jīng)驗 獲得超8個贊
ASP.NET Core我嘗試通過使用以下代碼創(chuàng)建項目來重新生成您的錯誤:
public class BaseModel
{
public int Id { set; get; }
public DateTime CreatedAt { get; set; }
public DateTime UpdatedAt { get; set; }
}
public class Question : BaseModel
{
public string QuestionText { get; set; }
public string Type { get; set; }
}
//Startup.cs
services.AddDbContext<ApplicationDbContext>(options =>
{
options.UseSqlite(
Configuration.GetConnectionString("DefaultConnection")
);
});
//Home Controller
public IActionResult Test()
{
_applicationDbContext.Questions.Add(new Question
{
Id = 0, //Changing this value affects the behaviour of the application
QuestionText = "Question text"
});
_applicationDbContext.SaveChanges();
return View(_applicationDbContext.Questions.ToList());
}
但是,我無法重新生成您的相同錯誤。當(dāng)Id(Test()方法中) 未設(shè)置或設(shè)置為等于 0 時,它可以工作。如果我設(shè)置為大于 0 的數(shù)字,例如 100,它第一次可以工作,但在下次運(yùn)行中會失敗,并顯示以下錯誤消息:
SQLite 錯誤 19:“UNIQUE 約束失敗:Questions.Id”
如您所見,我在這里使用 SQLite。生成的遷移如下:
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Questions",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("Sqlite:Autoincrement", true),
CreatedAt = table.Column<DateTime>(nullable: false),
UpdatedAt = table.Column<DateTime>(nullable: false),
QuestionText = table.Column<string>(nullable: true),
Type = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Questions", x => x.Id);
});
}
這里,Idfield被創(chuàng)建為身份字段。
我可以得出的結(jié)論是,您的Id字段是作為identity數(shù)據(jù)庫自動設(shè)置的字段創(chuàng)建的。所以你不應(yīng)該為它設(shè)置一個特定的值。也許在您處理的某個地方設(shè)置了非零值。正如 @feihoa 所說,此時的斷點(diǎn)和調(diào)試會話可能會有所幫助。
startup.cs如果問題仍然存在,您的配置代碼、遷移代碼以及有關(guān)您正在使用的數(shù)據(jù)庫類型的信息可能會有所幫助。

TA貢獻(xiàn)2012條經(jīng)驗 獲得超12個贊
事實(shí)證明,我的問題實(shí)際上出在我的 create 方法中。這是損壞的代碼:
// GET: Questions/Create
public IActionResult Create(int? id)
{
if (id == null) {
return NotFound();
}
PopulateId(id);
return View();
}
修復(fù):
// GET: Questions/Create
public IActionResult Create(int? questionGroupId)
{
if (questionGroupId== null) {
return NotFound();
}
PopulateId(questionGroupId);
return View();
}
由于默認(rèn)啟動有這個模板:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
綜上所述:
這是一個非常簡單的錯誤,因為我使用了糟糕的命名。默認(rèn)的 create get 方法沒有 ID,但由于我需要對頁面上的父對象執(zhí)行一些操作,因此我必須將其傳遞到我的視圖,并且 .Net 將我的 QuestionId(子級)設(shè)置為 QuestionGroupId (父)。
我希望這對遇到此問題的其他人有所幫助。
感謝評論者的幫助
- 3 回答
- 0 關(guān)注
- 207 瀏覽
添加回答
舉報