Array
(
)

Code First Oracle

Douglas Dionizio
   - 12 jul 2012

Bom dia,
Estou com o seguinte problema:
Estou realizando um projeto que preciso realizar um CRUD utilizando Entity Framework(4.3.1) + Oracle + Mapiamento por Code First.
O fato é que não estou conseguindo realizar update de um registro que se encontra gravado no BD.
Já tentei de algumas formas mas foi inútil.
O mapiamento está sendo feito da seguinte maneira:

#Código

 public class FilmeConfigurador : EntityTypeConfiguration<Filme>
    {
        public FilmeConfigurador()
            : base()
        {

            this.ToTable(CJAVA.TB_DD_FILME);

            this.HasKey<int>(a => a.Id);
            this.Property(a => a.Id)
             .HasColumnName(ID)
             .IsRequired();

            this.Property(a => a.Titulo)
               .HasColumnName(TITULO)
               .HasMaxLength(50)
               .IsRequired();

            this.Property(a => a.Produtora)
               .HasColumnName(PRODUTORA)
               .HasMaxLength(50);

            this.Property(a => a.DataLancamento)
               .HasColumnName(DATA_LANCAMENTO)
               .IsRequired();

            this.Property(a => a.Resumo)
               .HasColumnName(RESUMO)
               .HasMaxLength(255);

        }
     }

O Id é incrementado automaticamente utilizando uma sequence que criei no banco e um trigger que adiciona o proximo valor da sequence(.nextval) no Id antes de salvar o registro de vez.

O método salvar inicialmente se encontrava da seguinte maneira:
#Código
 public bool Salvar(Filme objFilme)
        {

            using (var ctx = new LocadoraContext())
            {

                ctx.Entry<Filme>(objFilme).State =
                objFilme.Id > 0 ? EntityState.Modified : EntityState.Added;

                return ((ctx.SaveChanges())>0);
            }
        }

Desta maneira o registro é salvo na tabela do banco. Mas não realiza o Update( nem o Delete se em um teste for alterado o EntityState para Deleted).
Fiz algumas alterações neste método para realizar o Update, segue abaixo algumas destas alterações:
1:
#Código
        public bool Salvar(Filme objFilme)
        {

            using (var ctx = new LocadoraContext())
            {
                Filme filmeCtx = ctx.FilmeContext.First(f => f.Id == objFilme.Id);

                filmeCtx.Titulo = objFilme.Titulo;
                filmeCtx.Produtora = objFilme.Produtora;
                filmeCtx.DataLancamento = objFilme.DataLancamento;
                filmeCtx.Resumo = objFilme.Resumo;

                return ((ctx.SaveChanges())>0);
           }
        }

2:
#Código
        public bool Salvar(Filme objFilme)
         {

           using (var ctx = new LocadoraContext())
            {
                ObjectContext objectContext = ((IObjectContextAdapter)ctx).ObjectContext;
           
                objectContext.ApplyCurrentValues<Filme>(LocadoraContext.FilmeContext, objFilme);
               
                return ((objectContext.SaveChanges())>0);
             }
         }

3:
#Código
           public bool Salvar(Filme objFilme)
           {

              using (var ctx = new LocadoraContext())
               {

                  Filme original = ctx.FilmeContext.First(f => f.Id == objFilme.Id);

                  var entryPlan = ctx.Entry(original);

                  entryPlan.CurrentValues.SetValues(objFilme);

                  entryPlan.State = EntityState.Modified;
                
                  
                  return ((ctx.SaveChanges())>0);
              }
          }

Dentre outros (vários para falar a verdade) que não comentei para poder colocar neste tópico.

Se alguém, por gentileza, puder analisar o caso e apresentar uma possível solução eu agradeço muito.

Desde já agradeço sua atenção.
OBS: Não irei postar todos os erros (stacktrace de todos os códigos acima) somente do numero 2:
StackTrace:
#Código
   at System.Data.Mapping.Update.Internal.TableChangeProcessor.CompileCommands(ChangeNode changeNode, UpdateCompiler compiler)
   at System.Data.Mapping.Update.Internal.UpdateTranslator.<ProduceDynamicCommands>d__0.MoveNext()
   at System.Linq.Enumerable.<ConcatIterator>d__71`1.MoveNext()
   at System.Data.Mapping.Update.Internal.UpdateCommandOrderer..ctor(IEnumerable`1 commands, UpdateTranslator translator)
   at System.Data.Mapping.Update.Internal.UpdateTranslator.ProduceCommands()
   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 LocadoraData.FilmeData.Salvar(Filme objFilme) in C:\workspaceDotNet\estudos\Locadora\LocadoraData\FilmeData.cs:line 104
   at LocadoraBusiness.FilmeBusiness.Salvar(Filme objFilme) in C:\workspaceDotNet\estudos\Locadora\LocadoraBusiness\FilmeBusiness.cs:line 28
   at LocadoraServices.LocadoraService.LocadoraServices.ILocadoraService.SalvarFilme(Filme objFilme) in C:\workspaceDotNet\estudos\Locadora\LocadoraServices\LocadoraService.svc.cs:line 37
   at SyncInvokeSalvarFilme(Object , Object[] , Object[] )
   at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
   at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
.

Douglas Dionizio
   - 12 jul 2012

Ninguém pode me ajudar???

Douglas Dionizio
   - 13 jul 2012

Pessoal ainda preciso de ajuda... :)

Douglas Dionizio
   - 13 jul 2012

?... :)