C# 为什么在更新实体时会出现InvalidCastException?

C# 为什么在更新实体时会出现InvalidCastException?,c#,entity-framework,C#,Entity Framework,我正在开发一个MVC项目,它是一个大系统的一小部分。我们有一个ORM服务,它是用NTier实体框架创建的(它本质上是带有N层支持的.Net EF),这个ORM为我们提供DataContext。我为一个问题挣扎了将近两天,谷歌搜索是不行的。以下是我的更新操作: IzinTalep original = DataContext.IzinTalep.AsQueryable() .Where(p => p.idtIzinTalep == id).FirstOrDefault(); //

我正在开发一个MVC项目,它是一个大系统的一小部分。我们有一个ORM服务,它是用NTier实体框架创建的(它本质上是带有N层支持的.Net EF),这个ORM为我们提供DataContext。我为一个问题挣扎了将近两天,谷歌搜索是不行的。以下是我的更新操作:

IzinTalep original = DataContext.IzinTalep.AsQueryable()
    .Where(p => p.idtIzinTalep == id).FirstOrDefault();

// [...] some changes to entity are made

original.IsApproved = false;//this is the only boolean in the entity

// [...] some other changes to entity

try
{
    DataContext.IzinTalep.Add(original);
    DataContext.SaveChanges();//the InvalidCastException is thrown here
}
catch (Exception e)
{ }
例外情况详情如下:

Unable to cast object of type 'System.Boolean' to type 'NTier.Common.Domain.Model.Entity'.

如果我把
IsApproved
一行注释掉,一切都像一个符咒。不幸的是,对
的这一更改已获得批准
意义重大,我必须使之成为可能

如果这就是我所认为的,那么这就是发生在我身上的事情

我有一个poco对象(例如汽车) 我有一个数据库,有一个汽车表 我的poco与数据库的属性完全匹配

我的EF模型是从数据库生成的,然后我有了一个很好的EF datacontext

问题是,当我向datacontext请求一辆汽车时,它给了我一个不同类型的汽车对象。本质上,我有一个Car类(我的)和一个DataContext.Car类型(从模型生成的代码)

所以我有几个选择

1) 创建一个实用函数(我称之为MapCar),它接收一个Car并返回一个DataContext.Car(另一个则相反)

e、 g

2) 类似于上面的#1,但我们使用AutoMapper库

3) 使用Linq为您完成工作

var myCar = DataContext.Cars.AsQueryable()
.Where(p => p.Id == id).FirstOrDefault()
.Select(c => new Car {Id=c.Id,Make=c.Make etc etc} );

这不是你的错。原因是n层实体框架中的一个问题,该问题已在1.4版中得到解决

要解决现有解决方案中的问题,只需更新“NTierEntityFramework.Common”nuget包。 您可以这样做,例如使用Package Manager控制台更新所有正在使用的软件包:

PM>设置执行策略不受限制-范围进程


PM>更新包

这是NTier实体框架的老问题,在上一版本中已修复。如果要使用旧版本,应执行以下操作:在NTier.Common.Domain包的Model文件夹中,将ChangeSetExtensions.cs的第250行更改为“as Entity”,而不是使用typecast as“(Entity)”

“IsApproved”属性是什么类型的?能否显示
IzinTalep
类?此外,您似乎正在再次
Add()
ing实体,而您的问题声称它应该是一个更新。如果删除
DataContext.IzinTalep.Add(原始)会发生什么?就像我说的,它是一个布尔值。我检查了两次。@CodeCaster它是一个自动生成的类,具有N层实体框架的代码生成。“我现在没有权限访问它。”@CodeCaster fair call。但如果可以的话,我会改变它,因为它令人困惑。
Add
也有异味,应给出不同的错误或添加重复项。另外,如果
DataContext.IzinTalep
确实是一个
DbSet
,那么
.AsQueryable()
应该是多余的。所以我要把这两个都去掉。但不幸的是,我不能说这些更改会修复任何问题。从代码中可以看出,OP直接对上下文返回的实体进行操作。此外,我没有poco模型。此解决方案适用于我们使用的
NTIER\u EF
版本。我将把这个标记为答案。
var myCar = DataContext.Cars.AsQueryable()
.Where(p => p.Id == id).FirstOrDefault()
.Select(c => new Car {Id=c.Id,Make=c.Make etc etc} );