强制转换为值类型'System.Int32'失败,因为具体化值为 null。但它适用于类似的代码



在我的控制器中,我正在数据库中搜索关联表中的特定记录。

public ActionResult MyAction(int picId, int myOtherId)
{
var itemToEdit =
db.AssocationTable.Single(
x => x.PropertyId == picId && x.MyForeignKey == myOtherId);
var myRecord = db.TestTableOne.Find(itemToEdit.PropertyId);
var lstOfIntsINeed =
db.AssocationTable.Where(
x => x.PropertyId == picId && x.MyForeignKey != myOtherId)
.Select(x => x.MyForeignKey.Value)
.ToList();
// the list above, if nothing is found, will give me an empty list where Count == 0
}

现在我正在做相同的确切代码,但对于不同的属性,我正在接收:

强制转换为值类型"System.Int32"失败,因为具体化值为 null。结果类型的泛型参数或查询必须使用可为 null 的类型。

这是我的代码:

public ActionResult MyOtherAction(int picId, int myOtherId)
{
var itemToEdit =
db.AssociationTable.Single(
x => x.PropertyId == picId && x.MyOtherForeignKey == myOtherId);
var myMainRecord = db.TestTableOne.Find(itemToEdit.PropertyId);
var lstOfIntsINeed =
db.AssociationTable.Where(
x => x.PropertyId == picId && x.MyOtherForeignKey != myOtherId)
.Select(x => x.MyOtherForeignKey.Value)
.ToList();
}

在我的数据库和关联表的域模型类中,MyForeignKeyMyOtherForeignKey都可以为空:

[ForeignKey("TestTableTwo")]
public int? MyForeignKey { get; set; }
[ForeignKey("TestTableThree")]
public int? MyOtherForeignKey { get; set; }

那么,我的问题..为什么在第一个操作结果中,lst收到计数为0(这是我所期望的),而第二个操作结果收到异常错误?

我认为问题是您在没有先检查null的情况下在nullable int上调用.Value。 最终,这意味着您在查询中间执行缩小隐式转换。

如果要在 .NET 中运行代码,并且x.MyOtherForeignKey为 null,则会引发Nullable object must have a value异常。 在本例中,代码将转换为 Linq-to-Sql 表达式并在 EntityFramework 中运行。 我认为它是在您的第二个查询中找到一个空x.MyOtherForeignKey并给出此异常。

根据您希望代码在遇到null时执行的操作,您可以更改它以过滤掉nulls

var lstOfIntsINeed =
db.AssociationTable.Where(
x => x.PropertyId == picId && x.MyOtherForeignKey != myOtherId && x.MyOtherForeignKey != null)
.Select(x => x.MyOtherForeignKey.Value)
.ToList();

。或将 null 替换为默认值。

我认为您的第一个查询中也存在同样的问题,它在您的测试中没有失败的唯一原因是因为查询不返回任何条目(或者更具体地说,没有带有nullMyForeignKey的条目),所以它没有失败。

鉴于您已将MyForeignKey定义为可为 null,则必须考虑它为 null 的情况,因此在该查询中修复它也是明智的。

您可以通过更改.Where()子句以故意返回具有 null 值的 AssociationTable 条目来测试是否是这种情况。

希望这有帮助

相关内容

最新更新