savechanges()之后意外的值更改

时间:2015-01-06 19:34:04

标签: c# entity-framework savechanges

我正试图通过c#中的visual studio 2013在基于Entity Framework的数据库上保存一个值。

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

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

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()invokation可以改变那个值,因为db上的拍卖列没有限制,我的意思是,为什么它不能简单地为0?

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

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

使用 Data Annotations

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

使用 Fluent Api

在您的Context中,覆盖OnModelCreating方法并执行以下操作:

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