【问题标题】:How to auto increment composite key Id only when a specific condition is met?仅当满足特定条件时,如何自动增加复合键 ID?
【发布时间】:2014-06-03 15:19:33
【问题描述】:

我有一个代码优先 MVC 5 项目,其模型具有复合键:

public class XYZ
{
    [Key]
    [Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    //For reporting purposes.
    [Key]
    [Column(Order = 2)]
    public int Version { get; set; }

我正在尝试跟踪每个 XZY 的版本。我只希望 Id 属性在版本为 1 时递增,否则在表中添加一个具有相同 ID 号和递增版本的新行。

我不确定如何让 ID 仅在创建新的 XYZ 而不是新版本时自动递增。关于如何让 Id 仅在我想要一个新的 XYZ 而不是其他版本时自动递增的任何建议?

版本控制的目的是跟踪不同的条目版本,以便可以回滚历史记录。我目前的一个问题是这个项目已经完成了一半,并且由于设计不佳和/或缺乏知识(以前没有人首先编写过 Web 开发代码),我不愿意改变数据库的组织方式。

有用的项目信息:Visual Studio 2013、SQL Server 2012、ASP.Net MVC 5 C#。

【问题讨论】:

    标签: c# sql-server asp.net-mvc ef-code-first sql-server-2012


    【解决方案1】:

    您不能为此使用IDENTITY 列。您可以将SEQUENCE 与手动 T-SQL 代码一起使用,但这很乏味并且序列是非事务性的。

    可能,您将不得不完全放弃自动生成的身份方案,并通过查询以前的最大 ID 自己生成 ID。请注意,这将引入与许多并发插入相关的争用点。

    还有其他用于手动 ID 生成的方案。可能值得做一些研究。

    【讨论】:

    • 所以如果我坚持按我的方式做,我需要锁定表以获取 ID,然后插入新行?不幸的是,由于我无法控制的情况,我现在对此感到困惑。
    • 您不需要锁定表,但您需要锁定从最后一行开始的键范围。这有效地序列化了作用于表最后一部分的所有操作。如果您可以容忍 ID 差距,那么有办法解决这个问题。值得研究一下。我会搜索“SQL Server ID 生成策略”。
    猜你喜欢
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多