6

我正在使用带有 ODP.NET 11.2.0.3.0 的实体框架。我得到了一些表的持久性,但是这个完全拒绝添加一个简单的新对象,我不太明白。非常感谢您的帮助。谢谢

这是代码。我通过模型浏览器从对象中删除了图像字段,但调用 SaveChanges() 时代码仍然失败。

var corpDirectoryEntities = new CorpDirectoryEntities();
var cc = new EmployeePhoto();
cc.UserId = 12345;   // NUMBER field
cc.ImageName = "imagename";   // VARCHAR2(100)
cc.Image = photoStream;   // LONG RAW
corpDirectoryEntities.EmployeePhotos.AddObject(cc);
corpDirectoryEntities.SaveChanges();

发生以下异常。

System.Data.UpdateException 未被用户代码处理
  Message=更新条目时发生错误。有关详细信息,请参阅内部异常。
  源=系统.数据.实体
  堆栈跟踪:
       在 System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager,IEntityAdapter 适配器)
       在 System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache)
       在 System.Data.Objects.ObjectContext.SaveChanges(SaveOptions 选项)
       在 System.Data.Objects.ObjectContext.SaveChanges()
       在 Repositories.Services.CorpDirectory.CorpDirectoryRepository.SaveDirectoryAccountPhoto(Int32 accountId, Byte[] photoStream) 在 C:\Dev\Projects\Repositories\Services\CorpDirectory\CorpDirectoryRepository.cs:line 356
       在 C:\Dev\Projects\Repositories.Tests\CorpDirectory\CorpDirectoryUserTestFixture.cs:line 192 中的 Tests.CorpDirectory.CorpDirectoryUserTestFixture.TestGetUserPhoto()
  内部异常:System.Data.EntityCommandCompilationException
       消息=准备命令定义时发生错误。有关详细信息,请参阅内部异常。
       源=系统.数据.实体
       堆栈跟踪:
            在 System.Data.Mapping.Update.Internal.UpdateTranslator.CreateCommand(DbModificationCommandTree 命令树)
            在 System.Data.Mapping.Update.Internal.DynamicUpdateCommand.CreateCommand(UpdateTranslator 翻译器,Dictionary`2 identifierValues)
            在 System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator 转换器,EntityConnection 连接,Dictionary`2 identifierValues,List`1 generatedValues)
            在 System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager,IEntityAdapter 适配器)
       内部异常:System.InvalidOperationException
            由于对象的当前状态,消息=操作无效。
            源=Oracle.DataAccess
            堆栈跟踪:
                 在 Oracle.DataAccess.Client.SqlGen.DmlSqlGenerator.ExpressionTranslator.Visit(DbScanExpression 表达式)
                 在 System.Data.Common.CommandTrees.DbScanExpression.Accept(DbExpressionVisitor 访问者)
                 在 Oracle.DataAccess.Client.SqlGen.DmlSqlGenerator.GenerateInsertSql(DbInsertCommandTree 树,EFOracleProviderManifest providerManifest,EFOracleVersion sqlVersion,List`1& 参数)
                 在 Oracle.DataAccess.Client.SqlGen.SqlGenerator.GenerateSql(DbCommandTree 树,EFOracleProviderManifest providerManifest,EFOracleVersion sqlVersion,List`1& 参数,CommandType& commandType)
                 在 Oracle.DataAccess.Client.EFOracleProviderServices.CreateCommand(EFOracleProviderManifest providerManifest,DbCommandTree commandTree)
                 在 Oracle.DataAccess.Client.EFOracleProviderServices.CreateDbCommandDefinition(DbProviderManifest providerManifest,DbCommandTree commandTree)
                 在 System.Data.Common.DbProviderServices.CreateCommandDefinition(DbCommandTree 命令树)
                 在 System.Data.Common.DbProviderServices.CreateCommand(DbCommandTree commandTree)
                 在 System.Data.Mapping.Update.Internal.UpdateTranslator.CreateCommand(DbModificationCommandTree 命令树)
            内部异常:

4

3 回答 3

16

所以,看了几个小时后,我终于明白了。我检查了 .ssdl 文件。我的对象之间的一个区别在于<EntitySet ... >定义的方式。我改变了它,当然,它现在可以工作了。EF 设计器简直是神来之笔。

<EntitySet Name="EmployeePhoto" ... store:Name="TABLE_NAME">
    <DefiningQuery>
        SELECT ..... 
    </DefiningQuery>
</EntitySet>

我删除了<DefiningQuery...>并将其替换为以下内容以匹配其他实体:

<EntitySet Name="EmployeePhoto" ... />
于 2012-07-12T14:16:53.903 回答
2

如果 oracle 表上没有主键,实体框架将使其在导入到您的 EF 模式时使用定义查询。然后,由于它是查询,而不是表,因此当您尝试向其添加内容时,它会因无效操作异常而崩溃。

于 2013-12-17T14:50:49.447 回答
0

我在尝试升级旧项目时遇到了这个错误。

确保您的项目与包文件中列出的 .net 框架版本匹配。例如,如果您列出了 net452,请确保您的项目设置为使用 net 4.5.2。如果您的解决方案中有多个项目,请确保它们都设置为正确的 .net 框架版本。

另外,我注意到在向项目添加新数据模型时,会混淆要添加哪个模型文件。我相信这是由于我的开发盒上安装了 TFS(我有快递,然后安装最新的)。为了解决这个问题,我暂时断开了项目与 TFS 的连接)。

于 2015-05-04T16:57:18.923 回答