IQueryable上的C#Entity Framework.ToList()引发错误System.Data.SqlTypes.SqlNullValueException:数据为Null
我在过去见过这个问题的一些变体,但没有一个适用于我的问题,所以我开始新的一个 我有一个模型类IQueryable上的C#Entity Framework.ToList()引发错误System.Data.SqlTypes.SqlNullValueException:数据为Null,c#,entity-framework-core,C#,Entity Framework Core,我在过去见过这个问题的一些变体,但没有一个适用于我的问题,所以我开始新的一个 我有一个模型类Transactions。它有一个字符串属性TransactionNumber,如下所示: public string TransactionNumber { get; set; } public class Transactions { public string TransactionNumber { get; set; } // some int property publ
Transactions
。它有一个字符串属性TransactionNumber
,如下所示:
public string TransactionNumber { get; set; }
public class Transactions {
public string TransactionNumber { get; set; }
// some int property
public int SomeInt { get; set; }
}
它在数据库中有一列,如下所示:
TransactionNumber varchar(64) not null,
当我尝试获取满足以下条件的实体时:
var transactions = transactionContext.Transactions
.Where(t => string.Equals(t.TransactionNumber, "15335564-1"));
然后尝试处理这些事务,如下所示:
if (transactions.Any())
{
foreach (Transaction transaction in transactions.ToList())
{
transaction.PaymentStatus = transactionStatus.Status;
}
}
我得到以下错误:
System.Data.SqlTypes.SqlNullValueException:数据为空。无法对空值调用此方法或属性
位于Microsoft.Data.SqlClient.SqlBuffer.ThrowIfNull()在Microsoft.Data.SqlClient.SqlBuffer.get_Int32()
在Microsoft.Data.SqlClient.SqlDataReader.GetInt32(Int32 i)
at lambda_方法(闭包、QueryContext、DbDataReader、ResultContext、Int32[],ResultCoordinator) 我尝试过其他方法,如
FirstOrDefault()
,但我得到了相同的错误
我不确定它在哪里寻找Int32
感谢您的帮助
谢谢 假设你的班级是这样的:
public string TransactionNumber { get; set; }
public class Transactions {
public string TransactionNumber { get; set; }
// some int property
public int SomeInt { get; set; }
}
首先尝试将int属性声明为null
public class Transactions {
public string TransactionNumber { get; set; }
// some int property
public int? SomeInt { get; set; }
}
一旦确定是哪个属性导致了问题,您需要在代码中保持它为空,或者在数据库中执行相反的操作(保护列,使其永远不为空)尝试一下,看看它是否有效
// Loading it into memory here
var transactions = transactionContext.Transactions
.Where(t => t.TransactionNumber == "15335564-1").ToList();
// If this does not work try transactions.Count > 0
if (transactions.Any())
{
foreach (Transaction transaction in transactions)
{
transaction.PaymentStatus = transactionStatus.Status;
}
}
如果您想继续使用string.Equals()
,那么您可能可以使用如下内容
// Must Stream results to client first
var transactions = transactionContext.Transactions
.AsEnumerable().Where(t => string.Equals(t.TransactionNumber, "15335564-1")).ToList();
if (transactions.Any())
{
foreach (Transaction transaction in transactions)
{
transaction.PaymentStatus = transactionStatus.Status;
}
}
请尝试
t.TransactionNumber==“15335564-1”
而不是string.Equals(t.TransactionNumber,“15335564-1”)
。我应该提到,我使用了。其中(t=>t.TransactionNumber==“15335564-1”)
作为我测试的一部分,结果相同。您确定问题出在该列(TransactionNumber)上吗<代码>“get_Int32”让我想到一个数字列:您关注的列包含字符串。可能与TransactionNumber无关,但与Transaction的其他属性有关(因为您获取整个Transaction对象)。检查模型中所有不可为null的int属性,并与数据库进行比较,其中一个可能为null,因此,EF模型和数据库之间存在不匹配,在我看来,事务
对象上的另一个属性是int
,它在数据库行中为null,这就是为什么会出现异常。any调用不会检索数据,因此不会将值映射到属性,而tolist会。谢谢,这就是我的答案。将Ints更改为nullable可以让我找到更多有问题的字段,但最终,这就是它所做的。我不知道.Where()
会强制数据库完整性。再次感谢!干杯如果确实是这样,不要忘记接受它作为解决方案。