我正试图通过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。
答案 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);
}