【发布时间】:2015-06-08 13:02:48
【问题描述】:
我正在尝试使用实体框架 6 处理并发。我的实体如下所示;
public partial class Group : BaseEntity
{
public byte[] RowVersion { get; set; }
...............
}
映射
public partial class GroupMap : EntityTypeConfiguration<Group>
{
public GroupMap()
{
this.ToTable("CRM_Sales_Group");
this.HasKey(c => c.Id);
//tried like this too -> this.Property(e => e.RowVersion).IsRowVersion();
this.Property(e => e.RowVersion).IsConcurrencyToken().IsRowVersion();
}
通用存储库更新方法不会修改状态,它只是验证然后我调用 savechanges();
public virtual void Update(T entity)
{
try
{
if (entity == null)
throw new ArgumentNullException("entity");
}
catch (DbEntityValidationException dbEx)
{
var msg = string.Empty;
foreach (var validationErrors in dbEx.EntityValidationErrors)
foreach (var validationError in validationErrors.ValidationErrors)
msg += Environment.NewLine + string.Format("Property: {0} Error: {1}", validationError.PropertyName,
validationError.ErrorMessage);
var fail = new Exception(msg, dbEx);
//Debug.WriteLine(fail.Message, fail);
throw fail;
}
}
}
_groupRepository.Update(group);
在 Razor 视图中;
@Html.HiddenFor(model => model.RowVersion)
在控制器中捕捉它仍然没有运气
public ActionResult Edit(GroupModel model)
{
if (ModelState.IsValid)
{
try
{
group = model.ToEntity(group);
_groupService.UpdateGroup(group);
ContainerResolver.Resolve<IDbContext>().SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
var entry = ex.Entries.Single();
throw;
}
}
return View(model);
}
我真正错过了什么?
更新 1
好吧,我正在尝试遵循官方文档。 http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-application。我尝试在浏览器的两个不同选项卡中编辑同一记录,并在另一个选项卡更新中更新了一条记录和同一记录。 rowversion 值不同,但未触发异常。
【问题讨论】:
-
您能否完整描述数据库的两次更新,您具体在做什么? EF Optimistic 并发机制确保您在拥有“旧数据”时不会更新数据库。
-
控制器方法中解析的 dbcontext 是否与存储库中使用的实例相同?
-
我正在尝试遵循官方文档。 asp.net/mvc/overview/getting-started/…。我尝试在浏览器的两个不同选项卡中编辑同一记录,并在另一个选项卡更新中更新了一条记录和同一记录。 rowversion 值不同,但未触发异常。
-
我不是 EF 专家,因此可能只是在上面遗漏了它 -
rowversion的where子句在哪里? -
将 SQL 日志记录添加到您的 dbcontext 以查看在您
SaveChanges时生成的 SQL。您可以使用类似于此的行来执行此操作:context.Database.Log = s => Console.WriteLine(s);。 (如果控制台不合适,您可以将其指向其他内容)然后使用您看到的 SQL 编辑您的帖子。这会有所帮助。
标签: c# asp.net asp.net-mvc entity-framework concurrency