Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么查询一个非空序列(其唯一行的PK为0)有时会抛出错误?_C#_Sql Server_Entity Framework_Sequence_Primary Key - Fatal编程技术网

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版本?