我有一個這樣的實體:ASP.NET Web應用程序+實體框架4.0併發檢查
public class Player
{
[Required]
[Key]
public int Id { get; set; }
[Required]
public string FirstName { get; set; }
public string LastName { get; set; }
public string NativeCountry { get; set; }
[ConcurrencyCheck]
public DateTime LastModified { get; set; }
public virtual int TeamId { get; set; }
//navigational property
public virtual Team Team { get; set; }
public virtual ICollection<Tournament> Tournaments { get; set; }
}
這是我如何配置球員實體:
public PlayerConfiguration()
{
Property(e => e.Id).IsRequired();
Property(e => e.FirstName).IsRequired().IsConcurrencyToken(true);
Property(e => e.NativeCountry).IsOptional();
Property(e => e.LastModified).IsOptional().IsConcurrencyToken(true);
HasRequired(e => e.Team).WithMany(s => s.Players).HasForeignKey(f => f.TeamId);
}
重寫OnModelCreating
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Configuration.ValidateOnSaveEnabled = false;
Configuration.LazyLoadingEnabled = true;
modelBuilder.Configurations.Add(new PlayerConfiguration());
modelBuilder.Configurations.Add(new TeamConfiguration());
modelBuilder.Configurations.Add(new TournamentConfiguration());
modelBuilder.Entity<Player>().ToTable("Player");
modelBuilder.Entity<Team>().ToTable("Team");
modelBuilder.Entity<Tournament>().ToTable("Tournament");
base.OnModelCreating(modelBuilder);
}
某處我這樣做來更新播放器:
db.Entry<Player>(player).State = System.Data.EntityState.Modified;
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
}
當我嘗試使用兩個瀏覽器同時更新任何給定的播放器時,沒有任何反應。我不想使用TimeStamp註釋,因爲它會花費我一個額外的 列。如何使用現有的DateTime LastModified
列來跟蹤併發性。 我甚至嘗試將FirstName(和其他)作爲ConcurrencyToken,但是再次沒有發生。 這個[ConcurrencyCheck]
如何在asp.net web應用程序中工作? 請幫忙..
此實體的併發列的值是否在數據庫中發生更改?它的工作方式是將作爲併發標記的屬性的值與數據庫中的值進行比較,如果值相同,則意味着數據庫中的實體自從讀取後沒有更改,因此它是好,保存。另一方面,如果值不匹配,則意味着實體發生了變化,您可能會覆蓋更改。時間戳理想的原因是數據庫每次更新行時都會修改該值。 – Pawel 2012-01-28 12:05:51
另請注意,如果值未由數據庫更新,則每當更改屬性值時都會有併發異常,因爲它不再與數據庫中的內容匹配。 – Pawel 2012-01-28 12:06:51
Pawel,我在一個靜態字段中保留了舊的(原始的)LastModified值,但沒有編寫比較原始和當前的代碼。我的意思是,這是實體框架的工作權利?請幫忙 – Manish 2012-01-30 11:41:16