获取状态为Added的实体的主键

时间:2012-07-13 19:07:39

标签: c# .net asp.net-mvc entity-framework

问题

我正在为我的Web应用程序实现UnitOfWork和Repository样式数据访问层。我想使用我自己制作的自定义表来审核对数据库的更改。将新项目添加到上下文时会发生此问题。该项目已添加到上下文中,但尚未调用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);
}

1 个答案:

答案 0 :(得分:2)

简单的答案是您无法在分布式环境中执行此操作。保留项目后,您无法保证ID将是相同的。

使用客户端生成的GUID可以解决问题。这是我通常采取的方法,尽管我们不会就此开始辩论!你会发现结果大多是50/50。两者都有利有弊。对于您的方案,它可以工作!