2012-07-13 28 views
1

问题获取实体,其状态增加了

我实施的UnitOfWork和我的Web应用程序库的风格数据访问层的主键。我想用我自己制作的自定义表来审核对数据库的更改。将新项目添加到上下文时会发生问题。该项目被添加到上下文中,但SaveChanges()方法尚未被调用,因此该实体仍处于Added状态。这意味着尚未分配主键,这意味着我无法创建审计记录,并且从存储库中调用SaveChanges()将违反存储库编码风格。有没有办法获得添加状态的实体主键?

尝试性解决方案

,我能想到的唯一解决方法是使用随机的GUID,以便客户端可以生成它们。我有点犹豫,因为我听说使用随机的GUID作为身份字段可能代价高昂。

代码

//Method in my repository class 
public void Insert(T entity) 
{ 
    //Adds the entity the context 
    dbSet.Add(entity); 

    Audit audit= new Audit 
    { 
     Created = DateTime.Now, 
     PrimaryKey = entity.Key, //This is not set because the State of the entity is still Added 
    }; 

    Context.Audits.Add(audit); 
} 

回答

2

简单的答案是,你不能在分布式环境中做到这一点。一旦项目被保留,你不能保证该ID是相同的。

使用客户端生成的GUID可以解决问题。这是我通常采取的方法,但我们不要就此开始辩论!你大多会发现结果是50/50。两者都有优点和缺点。对于你的情况,它的工作原理!

+1

不要在数据库的GUID列上集群,不管你做什么 – 2012-07-13 19:51:40

+0

这意味着我的数据库中的所有索引都必须是非连续的GUID。我不知道这将如何影响性能 – 2012-07-16 14:31:19

+0

您需要权衡这个要求。在您的方案中预先保留项目并让数据库生成顺序标识是否是更好的选择? – 2012-07-16 14:52:01