由于对象的当前状态,操作无效

时间:2012-07-11 17:44:14

标签: entity-framework entity-framework-4 odp.net

我正在使用ODP.NET 11.2.0.3.0的Entity Framework。我得到了持久性工作的一些表,但这一个平坦拒绝添加一个简单的新对象,我无法弄明白。非常感谢您的帮助。谢谢

这是代码。我通过模型浏览器从对象中删除了图像字段,并且在调用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 was unhandled by user code
  Message=An error occurred while updating the entries. See the inner exception for details.
  Source=System.Data.Entity
  StackTrace:
       at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
       at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache)
       at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
       at System.Data.Objects.ObjectContext.SaveChanges()
       at Repositories.Services.CorpDirectory.CorpDirectoryRepository.SaveDirectoryAccountPhoto(Int32 accountId, Byte[] photoStream) in C:\Dev\Projects\Repositories\Services\CorpDirectory\CorpDirectoryRepository.cs:line 356
       at Tests.CorpDirectory.CorpDirectoryUserTestFixture.TestGetUserPhoto() in C:\Dev\Projects\Repositories.Tests\CorpDirectory\CorpDirectoryUserTestFixture.cs:line 192
  InnerException: System.Data.EntityCommandCompilationException
       Message=An error occurred while preparing the command definition. See the inner exception for details.
       Source=System.Data.Entity
       StackTrace:
            at System.Data.Mapping.Update.Internal.UpdateTranslator.CreateCommand(DbModificationCommandTree commandTree)
            at System.Data.Mapping.Update.Internal.DynamicUpdateCommand.CreateCommand(UpdateTranslator translator, Dictionary`2 identifierValues)
            at System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary`2 identifierValues, List`1 generatedValues)
            at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
       InnerException: System.InvalidOperationException
            Message=Operation is not valid due to the current state of the object.
            Source=Oracle.DataAccess
            StackTrace:
                 at Oracle.DataAccess.Client.SqlGen.DmlSqlGenerator.ExpressionTranslator.Visit(DbScanExpression expression)
                 at System.Data.Common.CommandTrees.DbScanExpression.Accept(DbExpressionVisitor visitor)
                 at Oracle.DataAccess.Client.SqlGen.DmlSqlGenerator.GenerateInsertSql(DbInsertCommandTree tree, EFOracleProviderManifest providerManifest, EFOracleVersion sqlVersion, List`1& parameters)
                 at Oracle.DataAccess.Client.SqlGen.SqlGenerator.GenerateSql(DbCommandTree tree, EFOracleProviderManifest providerManifest, EFOracleVersion sqlVersion, List`1& parameters, CommandType& commandType)
                 at Oracle.DataAccess.Client.EFOracleProviderServices.CreateCommand(EFOracleProviderManifest providerManifest, DbCommandTree commandTree)
                 at Oracle.DataAccess.Client.EFOracleProviderServices.CreateDbCommandDefinition(DbProviderManifest providerManifest, DbCommandTree commandTree)
                 at System.Data.Common.DbProviderServices.CreateCommandDefinition(DbCommandTree commandTree)
                 at System.Data.Common.DbProviderServices.CreateCommand(DbCommandTree commandTree)
                 at System.Data.Mapping.Update.Internal.UpdateTranslator.CreateCommand(DbModificationCommandTree commandTree)
            InnerException: 

3 个答案:

答案 0 :(得分:16)

所以,看了几个小时后,我终于明白了。我检查了.ssdl文件。我的对象之间的一个区别在于如何定义<EntitySet ... >。我改变了它,当然,它现在有效。 EF设计师真是太可怕了。

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

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

<EntitySet Name="EmployeePhoto" ... />

答案 1 :(得分:2)

如果oracle表上没有主键,Entity Frameworks会在将其导入EF模式时使用定义查询。然后,因为它是一个查询,而不是一个表,当你尝试向它添加一些东西时,它将会出现无效的操作异常。

答案 2 :(得分:0)

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

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

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