保存更改() 后出现意外的值更改

本文关键字:意外 保存更改 | 更新日期: 2023-09-27 18:36:24

我正在尝试通过 c# 中的 Visual Studio 2013 在基于实体框架的数据库上保存值。

我必须节省DB拍卖数据。每个拍卖都有自己的 ID,一个 int,这是它的主键。

当我尝试在数据库上添加拍卖时,我会执行以下操作:

using(var c = new AuctionSiteContext(ConnectionString)
{
var auction = new Database.Auction
       {
              Id = auctionId,    //auctionId=0
              /*
              other stuff
              */
       };
c.Auctions.Add(auction);
c.SaveChanges();
}

问题是 auctionId 设置为 0,我通过调试器检查了它,但是当我执行 saveChanges(); 并再次控制网站上唯一拍卖的值,其 Id 已更改为 1。

老实说,我不明白为什么 savechanges() 调用可以更改该值,因为数据库上的拍卖列没有限制,我的意思是,为什么它不能简单地为 0?

每次我添加拍卖时,它都会这样做,将 id 递增一个,但所有其他参数保持不变。

编辑:我决定从 0 开始序列,这就是这个意思。但我什至尝试从 1 开始,这意味着第一次拍卖的 id=1,但在保存更改后它变成了 2。

保存更改() 后出现意外的值更改

如果Id是数据库中的自动增量列,则可能会发生这种情况。当您将其保存到数据库时,数据库会将自己的值放入该列中,并且您的 EntityFramework 模型会自动相应地更新。

如果 Key 字段是整数,则 Code First 默认为 DatabaseGenerated Option.Identity。因此,如果要添加自己的 Id 值,则需要配置实体类。有两种方法可以做到这一点:

使用数据注释

[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Key]
public int Id { get; set; }

使用 Fluent API

在您的上下文中,覆盖方法 OnModelCreate 并执行以下操作:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  modelBuilder.Entity<Auction>()
  .HasKey(t => t.Id)
  .Property(t => t.Id)
  .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
}