gpt4 book ai didi

c# - Entity Framework 和 MySQL 的乐观并发

转载 作者:行者123 更新时间:2023-11-29 04:27:58 25 4
gpt4 key购买 nike

我目前正在使用 Entity Framework 4.1 和 MySQL 开发应用程序。我想使用开放式并发,因此需要创建一个允许 EF 检测并发问题的表结构。我的目标与此类似:http://blogs.msdn.com/b/alexj/archive/2009/05/20/tip-19-how-to-use-optimistic-concurrency-in-the-entity-framework.aspx .

我的问题是,与 MS SQL Server 相比,MySQL 中的时间戳类型不同。除此之外,时间戳和日期时间在 MySQL 中均不提供亚秒级精度 (http://feedblog.org/2007/05/26/why-doesnt-mysql-support-millisecond-datetime-resolution/)。因此,这些类型在检测并发问题时会非常糟糕。

我可以使用其他什么数据类型来解决这个问题?我在考虑也许使用 Guid。但是这种方法有两个潜在的问题: 1. MySQL 将 Guid 存储为 char(36),这使得它们非常低效。 2. 我不确定 EF 是否要求行版本严格递增,或者它是否足够唯一。

最佳答案

重要警告:未测试 - 只是大声思考。

EF 支持重写 SaveChanges ,所以也许一个选择是定义一个接口(interface),例如:

interface IVersionedRow {
int RowVersion {get;set;}
}

并向您的模型类和数据库表添加一个int RowVersion 属性/字段,并使用partial class 来实现此接口(interface)(使用隐式接口(interface)实现):

partial class Customer : IVersionedRow {}
partial class Order : IVersionedRow {}
...

然后覆盖SaveChanges,类似于:

public override int SaveChanges(SaveOptions options)
{
foreach (ObjectStateEntry entry in
ObjectStateManager.GetObjectStateEntries(EntityState.Modified))
{
var v = entry.Entity as IVersionedRow;
if(v != null) v.RowVersion++;
}
return base.SaveChanges(options);
}

然后应该作为手动实现的行版本计数器运行(理论上 - 未经测试)。为 RowVersion 启用更改验证,这应该会起作用。

关于c# - Entity Framework 和 MySQL 的乐观并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7608619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com