2012-07-11 7 views
6

Używam Entity Framework z ODP.NET 11.2.0.3.0. Nadal pracuję nad niektórymi stołami, ale ten jeden płaski nie chce dodać prostego nowego obiektu i nie jestem w stanie go rozgryźć. Twoja pomoc jest bardzo doceniana. DziękujemyOperacja jest nieprawidłowa z powodu bieżącego stanu obiektu

Oto kod. Usunąłem pole obrazu z obiektu przez przeglądarkę modelu i nadal kod zawodzi, gdy wywoływana jest funkcja 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(); 

Następujący wyjątek występuje.

 
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: 

Odpowiedz

16

Więc, patrząc na to przez wiele godzin, w końcu to dostałem. Sprawdziłem plik .ssdl. Jedna różnica między moimi obiektami polegała na zdefiniowaniu <EntitySet ... >. Zmieniłem go i, oczywiście, teraz działa. Projektant EF jest po prostu okropny.

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

usunąłem <DefiningQuery...> i zastąpić go z następujących czynności, aby dopasować inne podmioty:

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

Dodanie zapytania definiującego w tajemniczy sposób przerywa operacje encji za pomocą bazy danych Oracle. – BigMomma

+2

Dowolny pomysł, dlaczego projektant generuje tabele jako zapytania? –

+0

Ponieważ Microsoft i Oracle nie mogą się dogadać. –

2

Jeśli nie ma klucza podstawowego na stole oracle, podmiot Konstrukcje pozwoli użyć określającą zapytanie kiedy go jest importowany do twojego schematu EF. Następnie, ponieważ jest to zapytanie, a nie tabela, zostanie wysadzony z nieważnym wyjątkiem operacji, gdy spróbujesz coś dodać.

0

Wystąpił ten błąd podczas próby uaktualnienia starszego projektu.

Upewnij się, że projekt jest zgodny z wersją środowiska .net wymienioną w pliku pakietu. Na przykład. jeśli masz na liście net452, upewnij się, że twój projekt jest ustawiony na korzystanie z sieci 4.5.2. Jeśli masz więcej niż jeden projekt w swoim rozwiązaniu, upewnij się, że wszystkie są ustawione na poprawną wersję środowiska .net.

Również zauważyłem podczas dodawania nowego modelu danych do projektu, to się mylić, który model plik do dodania. Sądzę, że było to spowodowane zainstalowaniem TFS na moim dev boxie (miałem ekspresowe, a następnie instalowałem najnowsze). Aby rozwiązać ten problem, na razie odłączyłem projekt od TFS).