C# 为什么查询一个非空序列(其唯一行的PK为0)有时会抛出错误?
考虑一下这个简单的模型:C# 为什么查询一个非空序列(其唯一行的PK为0)有时会抛出错误?,c#,sql-server,entity-framework,sequence,primary-key,C#,Sql Server,Entity Framework,Sequence,Primary Key,考虑一下这个简单的模型: 使用System.ComponentModel.DataAnnotations; 使用System.ComponentModel.DataAnnotations.Schema; 使用Microsoft.EntityFrameworkCore; 名称空间控制台AP3 { 公共类ApplicationDbContext:DbContext { 公共DbSet Wtf{get;set;} 配置时受保护的覆盖无效(DbContextOptionsBuilder选项) =>opt
使用System.ComponentModel.DataAnnotations;
使用System.ComponentModel.DataAnnotations.Schema;
使用Microsoft.EntityFrameworkCore;
名称空间控制台AP3
{
公共类ApplicationDbContext:DbContext
{
公共DbSet Wtf{get;set;}
配置时受保护的覆盖无效(DbContextOptionsBuilder选项)
=>options.UseSqlServer(“服务器=(localdb)\\mssqllocaldb;数据库=DAFAQ0001;可信连接=True;”;
}
公共级WTF
{
[DatabaseGenerated(DatabaseGeneratedOption.None),Key]public long Aargh{get;set;}
公共重写字符串ToString()=>Aargh.ToString();
}
}
让我们尝试将一行放到这样创建的表中,然后查询这一行:
使用系统;
使用System.Linq;
名称空间控制台AP3
{
班级计划
{
静态void Main()
{
var db=new ApplicationDbContext();
Add(新的Wtf{Aargh=0});
db.SaveChanges();
Console.WriteLine(db.Wtf.Any());//TRUE
Console.WriteLine(db.Wtf.First().ToString());//有效
Console.WriteLine(db.Wtf.Max(Wtf=>Wtf.Aargh));//异常
}
}
}
是的,最后一行生成了一个大的、胖的、丑陋的异常。显然,序列不包含任何元素
,这看起来很奇怪,因为它确实包含一个元素,就是我刚才插入的元素!而Any
方法本身也证实了这一点。更糟糕的是,查询这一个元素也可以工作,这可以通过调用First
来证明。只是因为我无法理解的原因,Max
失败了
True
0
Unhandled exception. System.InvalidOperationException: Sequence contains no elements.
at lambda_method(Closure , QueryContext , DbDataReader , ResultContext , Int32[] , ResultCoordinator )
at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()
at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)
at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression)
at System.Linq.Queryable.Max[TSource,TResult](IQueryable`1 source, Expression`1 selector)
at ConsoleApp3.Program.Main() in C:\Users\m\source\repos\ConsoleApp3\ConsoleApp3\Program.cs:line 23
C:\Users\m\source\repos\ConsoleApp3\ConsoleApp3\bin\Debug\netcoreapp3.1\ConsoleApp3.exe (process 11432) exited with code -532462766.
Press any key to close this window . . .
奇怪的是,插入PK为1
而不是0
的单个元素似乎可以解决这个问题
这是怎么回事?0
是主键的无效值吗?我在谷歌上搜索发现了这样一个答案:0
是一个完全有效的主键值
有人能解释一下为什么上面的代码会失败吗
编辑:响应注释:如果我在SQL Server Explorer窗口中单击并查看此表的代码,我会得到以下结果:
创建表[dbo].[Wtf](
[Aargh]BIGINT不为空,
约束[PK_Wtf]主键群集([Aargh]ASC)
);
在VS中分析此脚本显示正在执行以下SQL以获取Max
:
从[Wtf]中选择MAX([w].[Aargh])作为[w]
在VS中的SQL Server对象资源管理器中执行相同的SQL查询会产生以下结果:
(无列名)
0
您的问题在其他地方,可能与EF有关。是否应该使用MaxOrDefault()而不是简单地在val上调用MAX?您可以使用0作为PK值,该列的长类型没有问题。您可以检查以下内容。@rbaryyoung问题已更新,以提供您要求的信息。我想您会发现这是EF限制。。。在中,键类型和值表示,在向上下文添加新实体时,键属性必须始终具有非默认值,但某些类型将由数据库生成。换句话说,您不能使用0
作为键值,因为它是long
@AlwaysLearning的默认值,尽管这是一个问题。。。谢谢你告诉我这是哪个EF版本?