我正在尝试通过 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);
}