MVC 3 N-Tier应用程序 - 尝试使用context.Entry更新记录的执行引擎异常

时间:2012-02-08 10:57:38

标签: asp.net-mvc-3 dbcontext

我正在开发MVC 3中的n层应用程序。我正在使用现有数据库,因此使用了数据库第一种方法,并使用DbContext生成器在我的域层中创建了POCO。 使用以下命令在数据库上执行插入没有问题:

context.Programmes.Add(programme); //where programme is a programme object

但是我在使用以下方法找到程序时遇到了真正的问题:

Context.Programmes.Find(id); //where I was passing the primary key value in as Id.

我不记得是什么错误,但我做了一些研究,并听说这与使用这种方法的键的命名约定有关?无论如何,我通过使用:

来绕过它
return context.Programmes.Single(u => u.ProgrammeId == ProgrammeId);

现在我正在努力使用以下方法更新记录:

context.Entry(Find(programme.ProgrammeId)).CurrentValues.SetValues(programme);

这不起作用并抛出执行引擎异常

但如果我使用旧记录并使用以下方法手动映射更新的值

var oldVals = context.Programmes.Single(u => u.ProgrammeId == programme.ProgrammeId);

然后:

oldVals.ProgrammeState = programme.ProgrammeState;
oldVals.ProgrammeVersion = programme.ProgrammeVersion;
oldVals.Title = programme.Title;
oldVals.ProgrammeCode = programme.ProgrammeCode;
oldVals.Division = programme.Division; oldVals.Faculty
...etc (there are quite a few more fields)

这似乎工作正常。 我想我已经隔离了问题的根源,它似乎与使用context.Entry有关,我得到的错误是: 抛出了类型'System.ExecutionEngineException'的异常。 任何帮助都将非常感激,虽然我可以手动映射更新我很确定这不是最佳做法! 感谢

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,所以我想发布它以防万一这对其他人有用:

在我的域层中,我引用了Entity Framework 4.1 - 只需要删除它并添加引用4.2以使用查找和条目等。

另外,对于信息,服务层和MVC层中的引用都需要指向同一个实体dll - 注意到有时这些可以变化 - 即使它是相同的版本,有时它是一个不同的文件 - 我必须确保我的所有人都是:

C:\ Visual Studio Projects..etc ... \ packages \ EntityFramework.4.2.0.0 \ lib \ net40 \ EntityFramework.dll

一旦我做到了这一点,我就可以使用:

return context.Programmes.Find(ProgrammeId);

更优雅的更新:

context.Entry(programme).State = EntityState.Modified;