Code First Oracle
12/07/2012
0
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:
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:
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:
2:
3:
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:
.
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:
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:
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:
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:
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:
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:
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
Curtir tópico
+ 0
Responder
Posts
Clique aqui para fazer login e interagir na Comunidade :)