首页 > 解决方案 > 当我尝试在字段为主键时插入数据库时​​,为什么“ID = 0”?

问题描述

我正在尝试BookInfo在数据库的表中插入(创建)一本书,但出现此错误:

处理请求时发生未处理的异常。SqlException:INSERT 语句与 FOREIGN KEY 约束“FK_Book_Categories_BookInfo_BookID”冲突。冲突发生在数据库“MyBookShopDB”、表“dbo.BookInfo”、列“BookID”中。

我有BookInfo一个Category多对多的关系。

我正在使用视图模型来完成这项工作。我认为问题在于,当我跟踪我的Create操作方法时,我看到的BookID是“0”

但是BookID被定义为自动增量主键,我不知道为什么当我尝试在数据库中创建或插入一本书时它仍然是“0”....

有谁知道我应该怎么做才能解决这个问题?

谢谢!

public async Task<IActionResult> Create(BooksCreateViewModel ViewModel)
{
    if (ModelState.IsValid)
    {
        Book book = new Book()
                        {
                            ISBN = ViewModel.ISBN,
                            Stock = ViewModel.Stock,
                            Price = ViewModel.Price,
                            Title = ViewModel.Title,
                        };

        await _context.Books.AddAsync(book);
    }
}

这是 BookInfo 类:

  [Table("BookInfo")]
public class Book
{
    [Key]
    public int BookID { get; set; }

    [Required]
    public string Title { get; set; }
    public string Summary { get; set; }
    public int Price { get; set; }
    public int Stock { get; set; }
}

这是迁移类:

migrationBuilder.CreateTable(
            name: "BookInfo",
            columns: table => new
            {
                BookID = table.Column<int>(nullable: false)
                    .Annotation("SqlServer:Identity", "1, 1"),
                Title = table.Column<string>(nullable: false),
                Summary = table.Column<string>(nullable: true),
                Price = table.Column<int>(nullable: false),
                Stock = table.Column<int>(nullable: false),
            },

SQL

ALTER TABLE [dbo].[Book_Categories] ADD  CONSTRAINT [PK_Book_Categories] PRIMARY KEY CLUSTERED ([BookID] ASC,[CategoryID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

标签: c#sql-serverentity-framework-core

解决方案


在 Book Entity 中,您是否向 Book.ID 添加了一个装饰器以通知实体框架允许服务器分配值?

像这样的东西:

public class Book
{
    public Book() { }

    [DatabaseGenerated(DatabaseGeneratedOption.Identity), Key]
    public int ID { get; set; }
    public string ISBN { get; set; }
    public string Stock { get; set; }
    public string Price { get; set; }
    public string Title { get; set; } 
}

Entity Framework Core Database Annotation 的相关信息


推荐阅读