【问题标题】:Obtain primary key of entity whose state is Added获取状态为已添加的实体的主键
【发布时间】:2012-07-14 03:15:29
【问题描述】:

问题

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

【问题讨论】:

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


    【解决方案1】:

    简单的答案是您不能在分布式环境中执行此操作。一旦项目被持久化,您无法保证 ID 会相同。

    使用客户端生成的 GUID 确实可以解决问题。这是我通常采用的方法,但我们不要就此展开辩论!您通常会发现结果是 50/50。两者都有优点和缺点。对于您的场景,它有效!

    【讨论】:

    • 无论你做什么,都不要聚集在数据库中的 GUID 列上
    • 这意味着我的数据库中的所有索引都必须是非连续的 GUID。我不知道这会如何影响性能
    • 您需要根据要求权衡。在您的场景中,预先保存项目并让数据库生成顺序标识是不是更好的选择?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多