处理非身份主键的生成

时间:2011-02-23 12:30:51

标签: entity-framework transactions entity-framework-4 primary-key

我们目前拥有的表没有主键的标识。由于互操作性,改变它的成本太高。

我正在考虑处理ObjectContext的SavingChanges事件以设置其值。

(伪代码)

void SavingChanges(context)
{
    foreach (var entity in context)
    {
        if (entity.HasIdentity) continue;

        entity.PrimaryKey = GetNextPrimaryKey(entity.Type);
    }
}

我只能考虑使用单独的连接来完成此任务。是的,GetNextPrimaryKey将被限制为减少往返次数,但我想解释整体想法是不够的。

它会起作用吗?我应该尝试不同的东西吗?

1 个答案:

答案 0 :(得分:0)

这取决于方法GetNextPrimaryKey中的逻辑。

如果您的方法在多个线程中执行,那么您将有机会将相同的键分配给多个对象。

Buti如果您的GetNextPrimaryKey推进您的密钥并始终返回一个新密钥,无论是否使用它,那么就没有问题。

但是,如果您的逻辑只是找出最后使用的密钥并执行密钥+ 1,那么在多线程情况或Web应用程序中,您将遇到冲突。

最好是使用某种存储过程并始终从SP返回一个新密钥,因此在并行执行GetNextPrimaryKey时不会出现任何问题。