2012-07-11 49 views
6

Estoy usando Entity Framework con ODP.NET 11.2.0.3.0. Tengo persistencia trabajando para algunas tablas, pero esta se niega a agregar un objeto nuevo y no puedo entenderlo. Tu ayuda es muy apreciada. GraciasLa operación no es válida debido al estado actual del objeto

Aquí está el código. Eliminé el campo de imagen del objeto a través del navegador de modelos y aún así el código falla cuando se llama a 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(); 

Se produce la siguiente excepción.

 
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: 

Respuesta

16

Así que, después de mirarlo durante horas, finalmente lo conseguí. Revisé el archivo .ssdl. Una diferencia entre mis objetos estaba en cómo se definió <EntitySet ... >. Lo cambié y, por supuesto, funciona ahora. El diseñador EF es simplemente horrible.

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

Quité el <DefiningQuery...> y lo reemplazó con el siguiente para que coincida con otras entidades:

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

Agregar una consulta definitoria romperá misteriosamente las operaciones de Entity con un Oracle db. – BigMomma

+2

¿Alguna idea sobre por qué el diseñador está generando algunas tablas como consultas? –

+0

Porque Microsoft y Oracle no se llevan bien. –

2

Si no hay una clave principal en una tabla de Oracle, Entidad marcos hará que sea utilizar una consulta que define cuando se se importa en su esquema EF. Entonces, dado que es una consulta, no una tabla, explotará con una excepción de operación no válida cuando intente agregarle algo.

0

He estado llegando a este error al intentar actualizar un proyecto anterior.

Asegúrate de que tu proyecto concuerde con la versión de .NET Framework que se incluye en el archivo del paquete. P.ej. si tiene net452 en la lista, asegúrese de que su proyecto esté configurado para usar net 4.5.2. Si tiene más de un proyecto en su solución, asegúrese de que todos estén configurados con la versión .net framework correcta.

Además, me di cuando se añade un nuevo modelo de datos para el proyecto, que conseguiría confundido en cuanto a qué archivo de modelo para agregar. Creo que esto se debió a la TFS instalada en mi cuadro dev (tuve Express, luego instalé la última). Para resolver este problema, desconecté el proyecto de TFS por ahora).

Cuestiones relacionadas