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

?... :)