亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

創建方法嘗試從表單中插入 FK 作為 ID

創建方法嘗試從表單中插入 FK 作為 ID

C#
qq_花開花謝_0 2023-08-13 16:08:25
我正在嘗試將新數據插入到我的一個表中,但我收到了身份插入錯誤,即使我從未真正設置過 ID。我可以用創可貼修復此問題,但我想了解為什么會發生這種情況以及最佳實踐是什么如果我在添加到 DbContext 之前將 Id 設置為 0,它可以正常工作,但我根本不明白我的 Id 是在哪里設置的。這是我的模型:public class Question : BaseModel{    public QuestionGroup QuestionGroup { get; set; }    public int QuestionGroupId { get; set; }    [Display(Name ="Question Text")]    public string QuestionText { get; set; }    public string Type { get; set; }}public class BaseModel{    public int Id { get; set; }    [Display(AutoGenerateField = false), JsonIgnore]    public DateTime CreatedAt { get; set; }    [Display(AutoGenerateField = false), JsonIgnore]    public DateTime UpdatedAt { get; set; }}這是我的相關控制器代碼:(如果我取消注釋將 Id 設置為 0,則可以正常工作)[HttpPost][ValidateAntiForgeryToken]public async Task<IActionResult> Create(Question question){    //question.Id = 0;    if (ModelState.IsValid)    {        _context.Add(question);        await _context.SaveChangesAsync();        return RedirectToAction("Details", "QuestionGroups", new { id =         question.QuestionGroupId });    }    await PopulateId(question.QuestionGroupId);    return View(question);}這是我的表格:<div class="col-md-4">    <form asp-action="Create" enctype="multipart/form-data">        <div asp-validation-summary="ModelOnly" class="text-danger"></div>        <input asp-for="QuestionGroupId" type="hidden"         value="@ViewBag.QuestionGroupId"/>        <div class="form-group">            <label asp-for="QuestionText" class="control-label"></label>            <input asp-for="QuestionText" class="form-control" />            <span asp-validation-for="QuestionText" class="text-danger></span>        </div>這是有道理的,因為當我調試時,我看到的是:
查看完整描述

3 回答

?
慕神8447489

TA貢獻1780條經驗 獲得超1個贊

很奇怪。我所能建議的只是嘗試使 Id 屬性不是自動的,以通過查看調用堆棧來找出它的設置位置。


private int _id;

public int Id 

   get { return _id; }

   set { _id = value; } 

}

并使用“set”設置斷點


查看完整回答
反對 回復 2023-08-13
?
蝴蝶刀刀

TA貢獻1801條經驗 獲得超8個贊

ASP.NET Core我嘗試通過使用以下代碼創建項目來重新生成您的錯誤:


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());

    }

但是,我無法重新生成您的相同錯誤。當Id(Test()方法中) 未設置或設置為等于 0 時,它可以工作。如果我設置為大于 0 的數字,例如 100,它第一次可以工作,但在下次運行中會失敗,并顯示以下錯誤消息:


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被創建為身份字段。


我可以得出的結論是,您的Id字段是作為identity數據庫自動設置的字段創建的。所以你不應該為它設置一個特定的值。也許在您處理的某個地方設置了非零值。正如 @feihoa 所說,此時的斷點和調試會話可能會有所幫助。


startup.cs如果問題仍然存在,您的配置代碼、遷移代碼以及有關您正在使用的數據庫類型的信息可能會有所幫助。


查看完整回答
反對 回復 2023-08-13
?
繁花如伊

TA貢獻2012條經驗 獲得超12個贊

事實證明,我的問題實際上出在我的 create 方法中。這是損壞的代碼:



// GET: Questions/Create

        public IActionResult Create(int? id)

        {

            if (id == null) {

                return NotFound();

            }

            PopulateId(id);

            return View();

        }

修復:



// GET: Questions/Create

        public IActionResult Create(int? questionGroupId)

        {

            if (questionGroupId== null) {

                return NotFound();

            }

            PopulateId(questionGroupId);

            return View();

        }

由于默認啟動有這個模板:



app.UseMvc(routes =>

            {

                routes.MapRoute(

                    name: "default",

                    template: "{controller=Home}/{action=Index}/{id?}");

            });

綜上所述:


這是一個非常簡單的錯誤,因為我使用了糟糕的命名。默認的 create get 方法沒有 ID,但由于我需要對頁面上的父對象執行一些操作,因此我必須將其傳遞到我的視圖,并且 .Net 將我的 QuestionId(子級)設置為 QuestionGroupId (父)。


我希望這對遇到此問題的其他人有所幫助。


感謝評論者的幫助


查看完整回答
反對 回復 2023-08-13
  • 3 回答
  • 0 關注
  • 209 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號