4

我们目前有没有主键身份的表。由于互操作性的缘故,改变这一点将代价太高。处理非身份主键的生成

我在考虑处理ObjectContext的SavingChanges事件来设置它的值。

(伪)

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

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

我只能想到用一个单独的连接来实现这一点。是的,GetNextPrimaryKey会减少往返次数,但我认为解释整体想法是十分恰当的。

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

+0

我认为它应该工作。 – 2011-02-23 14:03:59

+0

我想我应该做一个尖峰:) – 2011-02-25 02:12:40

回答

0

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

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

Buti如果你的GetNextPrimaryKey提前你的密钥并且总是返回一个新的密钥,不管它是否被使用,那么没有问题。

但是,如果您的逻辑只是查找上次使用的密钥并执行key + 1,那么在多线程情况下或Web应用程序中,您将发生冲突。

最好是使用某种存储过程,并始终从SP返回一个新的密钥,所以在并行执行GetNextPrimaryKey的情况下不会有任何问题。