現在、Entity Framework 5 を使用して ASP.Net MVC 4 アプリケーションに取り組んでいます。初期開発段階では CodeFirst を使用しました。ただし、自動移行を無効にし、SSMS を使用して POCO を直接使用して新しいテーブルを設計しています。すべてがうまくいっています。
最近、プロダクションで奇妙な問題を特定しました。最初に設計されたテーブルの 1 つのレコードは、自動インクリメント ID 値を 900 を超える数字でスキップしました。これは、過去 3 か月間に 3 回発生しました。アプリケーションをローカルでデバッグしましたが、再現できませんでした。観察されるパターンや傾向はありません。
モデル:
public class Enquiry
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public Int64 EnquiryId { get; set; }
[Required]
public int UserId { get; set; }
[Required]
public byte Bid { get; set; }
...
[Required]
public DateTime Created { get; set; }
[Required]
public DateTime Modified { get; set; }
}
public class EnquiryDetail
{
[Key]
public Int64 EnquiryId { get; set; }
[Required]
public int CreditScore { get; set; }
[Required]
public byte BidMode { get; set; }
public virtual Enquiry Enquiry { get; set; }
}
DB コンテキスト:
public class EscrowDb : DbContext
{
public EscrowDb()
: base("name=DefaultConnection")
{
}
public DbSet<Enquiry> Enquiries { get; set; }
public DbSet<EnquiryDetail> EnquiryDetails { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<EnquiryDetail>()
.HasRequired<Enquiry>(ed => ed.Enquiry)
.WithRequiredDependent(e => e.EnquiryDetail);
}
}
コントローラ:
[Authorize]
public class EnquiryController : Controller
{
private EscrowDb _db = new EscrowDb();
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(EnquiryViewModel core)
{
var enquiry = new Enquiry();
// Some code to set properties using passed ViewModel
...
var enquiryDetail = new EnquiryDetail();
// Some code to set properties using passed ViewModel
...
enquiry.EnquiryDetail = enquiryDetail;
_db.Enquiries.Add(enquiry);
_db.SaveChanges();
}
}
このコードはすべて、ほぼ 1000 の数字の大きなギャップによって散発的にスキップされる ID 値を除いて、これまでのところ正常に機能しています。
誰もそのような問題に遭遇しましたか? あなたの考えを共有してください。