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。我如何自动设置?
您的 Rentals 表中的一列是标识列(猜测它是 ID 列)。您通常不想显式设置标识列的值,因此您的 SQL Server 不允许您不打开选项 (IDENTITY_INSERT)。
为避免此问题,无论您使用何种机制来保存更改都需要知道,在插入时,不要指定标识列。相反,您指定其余的列并让数据库决定标识列的值。同样,更新时,您通常不会修改此列,因此您的更新不应尝试更改它。
如果您提供有关用于保存模型的框架的更多信息,我们可能会提供更具体的答案。
如果您确实需要为标识列指定特定值(例如,将数据从一个数据库复制到另一个数据库是我亲自完成的一个示例),这一切都会发生变化。在这种情况下,您可以使用该语句set IDENTITY_INSERT ON来允许插入,然后在完成后将其关闭。
| 归档时间: |
|
| 查看次数: |
7899 次 |
| 最近记录: |