当 IDENTITY_INSERT 设置为 OFF 时,C# 无法为表“Rentals”中的标识列插入显式值

Jia*_*nYA 0 c# asp.net asp.net-mvc

我目前正在学习 ASP.NET MVC,我正在学习通过其 ID 获取对象并将其引用插入到数据库中。但是,我收到此错误

当 IDENTITY_INSERT 设置为 OFF 时,无法为表“Rentals”中的标识列插入显式值

我已经阅读并注意到有些人说要将身份插入设置为关闭,因为引用表的 ID 是自动递增的?但是我读到不推荐使用此方法,因为它显然会锁定表或仅对单个用户有用?我可以知道这样做的正确方法是什么吗?

这是我的控制器代码,它试图添加一个新的租赁

[HttpPost]
public IHttpActionResult CreateNewRental(RentalDTO RentalDTO)
{
    if (RentalDTO.MovieIds.Count == 0)
    {
        return BadRequest();
    }
    var customer = _context.Customers.SingleOrDefault(c => c.Id == RentalDTO.CustomerId);
    if (customer == null)
    {
        return BadRequest("Customer ID is not valid");
    }
    var movies = _context.Movies.Where(m => RentalDTO.MovieIds.Contains(m.Id)).ToList();
    if (movies.Count != RentalDTO.MovieIds.Count)
    {
        return BadRequest();
    }
    foreach (var movie in movies)
    {
        if (movie.NumberAvailable < 1)
        {
             return BadRequest();
        }
        movie.NumberAvailable--;
        var rental = new Rentals
        {
            Customer = customer,
            Movie = movie,
            DateRented = DateTime.Now,
        };
        _context.Rentals.Add(rental);
    }
    _context.SaveChanges();
    return Ok();
}
Run Code Online (Sandbox Code Playgroud)

这是我的出租模型

public class Rentals
{
    public byte Id { get; set; }
    [Required]
    public Customers Customer { get; set; }
    [Required]
    public Movies Movie { get; set; }
    public DateTime DateRented { get; set; }
    public DateTime? DateReturned { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是我用来创建表的迁移

CreateTable(
            "dbo.Rentals",
            c => new
                {
                    Id = c.Byte(nullable: false, identity: true),
                    DateRented = c.DateTime(nullable: false),
                    DateReturned = c.DateTime(),
                    Customer_Id = c.Int(nullable: false),
                    Movie_Id = c.Int(nullable: false),
                })
            .PrimaryKey(t => t.Id)
            .ForeignKey("dbo.Customers", t => t.Customer_Id, cascadeDelete: true)
            .ForeignKey("dbo.Movies", t => t.Movie_Id, cascadeDelete: true)
            .Index(t => t.Customer_Id)
            .Index(t => t.Movie_Id);
Run Code Online (Sandbox Code Playgroud)

更新:

我调试了我的代码并意识到当我添加一个新的租用时,0 被设置为 ID。我如何自动设置?

Tyl*_*Lee 5

您的 Rentals 表中的一列是标识列(猜测它是 ID 列)。您通常不想显式设置标识列的值,因此您的 SQL Server 不允许您不打开选项 (IDENTITY_INSERT)。

为避免此问题,无论您使用何种机制来保存更改都需要知道,在插入时,不要指定标识列。相反,您指定其余的列并让数据库决定标识列的值。同样,更新时,您通常不会修改此列,因此您的更新不应尝试更改它。

如果您提供有关用于保存模型的框架的更多信息,我们可能会提供更具体的答案。

如果您确实需要为标识列指定特定值(例如,将数据从一个数据库复制到另一个数据库是我亲自完成的一个示例),这一切都会发生变化。在这种情况下,您可以使用该语句set IDENTITY_INSERT ON来允许插入,然后在完成后将其关闭。