Linq 实体框架忽略不为空



当我执行以下操作执行代码时,我有一个带有可为空列的表......

IList<IChecklistQuestionEntity> questions = repository.Where(q => q.OriginalQuestionID.HasValue);
IList<IChecklistQuestionEntity> originalQuestions = repository.Where(q => !q.OriginalQuestionID.HasValue);

。我在探查器中看到的是...

SELECT 
[Extent1].[ID] AS [ID], 
[Extent1].[OriginalQuestionID] AS [OriginalQuestionID], 
[Extent1].[Question] AS [Question], 
FROM [dbo].[cklChecklistQuestion] AS [Extent1]
ORDER BY [Extent1].[Question] ASC

SELECT 
CAST(NULL AS int) AS [C1], 
CAST(NULL AS int) AS [C2], 
CAST(NULL AS varchar(1)) AS [C3], 
FROM  ( SELECT 1 AS X ) AS [SingleRowTable1]
WHERE 1 = 0

EF 类的实现方式如下...

[Table("cklChecklistQuestion")]
public class ChecklistQuestionEntity 
{
/// <summary>
/// Gets or sets the ID
/// </summary>
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID 
{ 
get;
set;
}
/// <summary>
/// Gets or sets the OriginalQuestionID
/// </summary>
public int? OriginalQuestionID 
{ 
get;
set;
}       
[Required]
public string Question 
{ 
get;
set;
}
public ICollection<ChecklistQuestionEntity> Revisions { get; set; }
}

当然,我希望在第一个查询上看到一个 Where IS NOT NULL 子句,在表上看到第二个 WHERE IS NULL 的选择。

我从搜索中使用EF 6.1.3,似乎此问题已经存在,但应该得到解决。 EF 6.2 会在这个问题上给我带来更多快乐吗?

编辑:我已经尝试过在OriginalQuestionID属性上使用和不使用虚拟关键字

编辑2:我也尝试过没有存储库,只有EF上下文

IList<ChecklistQuestionEntity> questions = context.Set<ChecklistQuestionEntity>().Where(q => q.OriginalQuestionID.HasValue).ToList();
IList<ChecklistQuestionEntity> originalQuestions = context.Set<ChecklistQuestionEntity>().Where(q => !q.OriginalQuestionID.HasValue).ToList();

并收到了相同的结果。

表的创建如下所示...

CREATE TABLE [dbo].[cklChecklistQuestion](
[ID] [int] IDENTITY(1,1) NOT NULL,
[OriginalQuestionID] [int] NULL,
[Question] [nvarchar](450) NOT NULL,
CONSTRAINT [PK_cklChecklistQuestion] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[cklChecklistQuestion]  WITH CHECK ADD  CONSTRAINT [FK_cklChecklistQuestion_cklChecklistQuestion] FOREIGN KEY([OriginalQuestionID])
REFERENCES [dbo].[cklChecklistQuestion] ([ID])
GO
ALTER TABLE [dbo].[cklChecklistQuestion] CHECK CONSTRAINT [FK_cklChecklistQuestion_cklChecklistQuestion]
GO

编辑3:我认为这篇文章建议它应该被修复

如何在实体框架中查询空值?

编辑4:也许它与这个问题有关... 实体框架 Linq 等于值或为 null

虽然它不同,因为 OriginalQuestionID 不是主键的一部分,但它是与同一表上的主键的外键关系

编辑5:道歉所有...当我尝试在较小的应用程序中复制此问题时,我发现我遗漏了一个关键部分。 我已经修改了上面的代码以包含修订属性。 另外,您需要以下上下文。

public class MyContext : DbContext
{
public MyContext(string nameOrConnectionString) : base(nameOrConnectionString)
{
}
protected MyContext()
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Commenting out the following resolves the issue
modelBuilder.Entity<ChecklistQuestionEntity>()
.HasRequired(cq => cq.OriginalQuestion)
.WithMany(cq => cq.Revisions)
.HasForeignKey(cq => cq.OriginalQuestionID)
.WillCascadeOnDelete(false);
}
}

好的,这不是真正的解决方案,但问题是由添加修订导航属性引起的。删除此语句可解决此问题。

modelBuilder.Entity<ChecklistQuestionEntity>()
.HasRequired(cq => cq.OriginalQuestion)
.WithMany(cq => cq.Revisions)
.HasForeignKey(cq => cq.OriginalQuestionID)
.WillCascadeOnDelete(false);

我相信这是一个错误,它与这里讨论的问题有关......

实体框架 Linq 等于值或为 null

虽然 OriginalQuestionID 不是表上将其与表的主键相关联的键的一部分,但似乎会导致 EF 不再相信它可以为空。

我尝试升级到EF 6.2,问题仍然存在。

我唯一的解决方法是删除修订导航属性。

最新更新