如何在Blazor Server中通过Entity Framework获取序列的下一个值?
获取数据库序列下一个值的正确方法
你用ExecuteSqlRaw得到-1是因为这个方法返回的是SQL语句执行后受影响的行数,而非查询结果——SELECT语句不会影响行,所以返回-1是预期行为。以下是两种正确获取序列值的方式:
方法一:直接执行查询并获取结果
使用ExecuteScalar(同步)或ExecuteScalarAsync(异步)来获取单行单列的查询结果,这是专门适配此类场景的方法:
// 同步方式 long seqValue = (long)_db.Database.ExecuteSqlRaw("SELECT nextval('sequence_name')"); // 异步方式(Blazor Server中推荐使用异步避免阻塞) long seqValue = (long)await _db.Database.ExecuteSqlRawAsync("SELECT nextval('sequence_name')");
如果是SQL Server等其他数据库,需调整SQL语句为对应语法,例如:
SELECT NEXT VALUE FOR sequence_name
方法二:使用EF Core的序列API
既然你已经在模型构建器中配置了序列,可以直接通过EF Core原生API生成序列值,无需手写SQL:
// 找到已配置的序列对象 var sequence = _db.Model.FindSequence("sequence_name"); // 异步获取下一个值 long seqValue = await _db.Database.GenerateSequenceValueAsync(sequence); // 同步获取下一个值 long seqValue = _db.Database.GenerateSequenceValue(sequence);
内容的提问来源于stack exchange,提问作者AsM
相关产品推荐
相关产品推荐

