Sql server 如何在创建新记录之前获取最大ID值?

Sql server 如何在创建新记录之前获取最大ID值?,sql-server,asp.net-mvc,entity-framework,primary-key,code-first,Sql Server,Asp.net Mvc,Entity Framework,Primary Key,Code First,我认为这在很多情况下都是一个普遍的问题,但我还没有在网上找到正确的答案。在我的MVC应用程序中,我有以下表格: 问题表: --------------------------------------------- IssueID (pk) | CategoryID (fk) | IssueNumber --------------------------------------------- 1 | 1 | 1 2

我认为这在很多情况下都是一个普遍的问题,但我还没有在网上找到正确的答案。在我的MVC应用程序中,我有以下表格:

问题表:

---------------------------------------------
IssueID (pk) | CategoryID (fk) | IssueNumber
---------------------------------------------
   1         |     1           |      1
   2         |     1           |      2
   3         |     2           |      1
   4         |     1           |      3
-----------------------------------
CategoryID (pk) | Prefix | Name
-----------------------------------
     1          |   COM  | Computer
     2          |   GEN  | General

类别表:

---------------------------------------------
IssueID (pk) | CategoryID (fk) | IssueNumber
---------------------------------------------
   1         |     1           |      1
   2         |     1           |      2
   3         |     2           |      1
   4         |     1           |      3
-----------------------------------
CategoryID (pk) | Prefix | Name
-----------------------------------
     1          |   COM  | Computer
     2          |   GEN  | General

在这里,我对两个类别(COM和GEN)使用IssueID(主键)字段。另一方面,我希望依次生成IssueNumber(1、2、3…),而不给CategoryID留任何间隙。另一方面,我还想从1为另一个类别创建IssueNumber,如上所示。因此,问题是:

1) 上述方法是否存在任何问题?如果是,你对此有何建议

2) 在创建记录之前,我应该如何获取IssueNumber的最大值?我想在SaveChanges()方法上实现这一点(我使用实体框架)。由于我没有将IssueNumber字段设置为PK,因此无法使MsSQL服务器自动增加此列的值

任何帮助都将不胜感激。提前谢谢


更新:

---------------------------------------------
IssueID (pk) | CategoryID (fk) | IssueNumber
---------------------------------------------
   1         |     1           |      1
   2         |     1           |      2
   3         |     2           |      1
   4         |     1           |      3
-----------------------------------
CategoryID (pk) | Prefix | Name
-----------------------------------
     1          |   COM  | Computer
     2          |   GEN  | General
以下是使用lambda的解决方案:

public int SaveIssue(Issue issue)
{
    int max = context.Issues.Where(m => m.CategoryID == issue.CategoryID ).Max(m => m.IssueNumber); 
    issue.IssueNum = max + 1; 

    context.Issues.Add(issue);
    context.SaveChanges(); 
    return issue.IssueNum ;
}

我不知道如何在EF中实现这一点,但通过SQL可以通过以下方式实现(我假设
IssueID
是一个标识列)

(在浏览器中编写的代码,未测试语法错误)

使用
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
可确保在您读取
MAX(issuember)
后,在提交事务之前,其他查询无法修改该结果


注意:要获得良好的性能,请确保
CategoryID
Issue
上被索引,以便SQL引擎可以对其执行一个而不是表锁。

但我没有将IssueNumber字段设为PK,我想为一个类别创建最大值+1。因此,在创建新id之前,应该记住CategoryID字段。您能解释一下如何做到这一点吗?@David问题不是问如何自动生成密钥,而是问如何自动生成
IssueNumber
,它跟在
RowNumber()之后(按CategoryID划分,按IssueID排序)
pattern.@ScottChamberlain完全正确,Scott。我误解了这个问题。谢谢。谢谢大卫,实际上我想在程序方面解决这个问题。我只想在创建新记录之前获得最大值和+1。我知道这似乎不好,但我不知道有什么更好的解决办法。有什么想法吗?如果你的列不是空的,你的查询结果可能是空的,考虑我的答案,我认为FrUnTAPI可以允许一个机制通过DbMultuBudioDebug对象的MAPtoStultEd规程声明来利用这样的过程,可以通过覆盖OnModelCreating事件来访问…@Scott Chamberlain:非常感谢您的回复。为了简单起见,我用lambda表达式解决了这个问题,如更新的代码所示。投票+