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()
会强制数据库完整性。再次感谢!干杯如果确实是这样,不要忘记接受它作为解决方案。