我有一个这样的实体: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