问题描述
目前在使用实体框架的ASP.Net MVC 4应用程序上工作5.使用CodeFirst进行初始开发阶段。但现在已经禁用了自动迁移,并直接使用SSMS设计新表并编写了POCO。一切都很好。最近,在生产中发现了一个奇怪的问题。其中一个最初设计的表中的记录跳过了自动增量标识值超过900个数字。这在过去3个月内发生了3次。在本地调试应用程序,但无法复制。没有任何模式或趋势观察。
型号:
public class Inquiry
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public Int64 EnquiryId {get;组;
[必需]
public int UserId {get;组; }
[必需]
public byte Bid {get;组;
...
[必需]
public DateTime Created {get;组; }
[必需]
public DateTime Modified {get;组;
}
public class EnquiryDetail
{
[Key]
public Int64 EnquiryId {get;组;
[必需]
public int CreditScore {get;组;
[必需]
public byte BidMode {get;组; }
public virtual查询查询{get;组; }
}
DBContext:
public class EscrowDb:DbContext
{
public EscrowDb()
:base(name = DefaultConnection)
{
}
public DbSet< Inquiry>查询{get;组; }
public DbSet&EnquiryDetail> EnquiryDetails {get;组;
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove< PluralizingTableNameConvention>();
modelBuilder.Entity< EnquiryDetail>()
.HasRequired< Inquiry>(ed => ed.Enquiry)
.WithRequiredDependent(e => e.EnquiryDetail);
}
}
控制器: p>
[授权]
public class EnquiryController:Controller
{
private EscrowDb _db = new EscrowDb );
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(EnquiryViewModel core)
{
var inquiry = new Inquiry();
//一些使用传递的ViewModel设置属性的代码
...
var enquiryDetail = new EnquiryDetail();
//一些使用传递的ViewModel设置属性的代码
...
enquiry.EnquiryDetail = enquiryDetail;
_db.Enquiries.Add(询问);
_db.SaveChanges();
}
}
所有这些代码一直工作正常,除了身份价值被几乎1000个数字的巨大差距偶然跳过。
有没有人遇到过这样的问题?请分享您的想法。
如果您需要消除这些差距,您可能会失去运气。
在开发/测试新应用程序时,我自己碰到了这个问题。我根据我读过的关于sql server 2012的sql azure发生了什么。我无法找到有关sql azure的任何文档。
从我读过的这是一个功能,作为一个错误IMO。在Sql server 2012中,Microsoft添加了创建序列的功能。序列记录在1000块中使用的值。所以让我们说你的序列正在进行... 1,2,3,4,5 ...然后你的sql服务器重新启动。顺序已经保存了块1-1000已被使用的事实,因此它将跳转到下一个1000 ....所以你的下一个值是1001,1002,1003,1004 ....这提高了性能插入时使用序列,但会导致异常的间隙。你的序列有一个解决方案。指定序列时,添加NOCACHE参数,使其不能一次保存1000个块。
在这个问题上,身份列似乎已经被改变为使用这个相同的范例。所以当你的服务器,或者在这种情况下,你的sql azure实例重新启动,你可以在你的标识列中获得大的差距(1000),因为它是将大块缓存为used。 sql server 2012有一个解决方案。您可以指定启动标志t272将您的身份还原为使用旧的sql server 2008 r2范例。问题是我不知道(可能不可能)如何在sql Azure中指定这一点。找不到文件。
在msdn中检查身份的文档。具体来说,服务器重启或其他故障后的连续值部分。这是它所说的:
So if you need to have consecutive values you could try specifying a sequence with nocache instead of relying on your identity column. Haven't tried this myself, but sounds like you'll have trouble getting this to work with entity framework.
Sorry if this doesn't help much, but at least it's some info on what your experiencing.
这篇关于Windows Azure SQL数据库 - 身份自动增量列跳过值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!