Code First Oracle
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
Curtidas 0
Respostas
Douglas Dionizio
12/07/2012
Ninguém pode me ajudar???
GOSTEI 0
Douglas Dionizio
12/07/2012
Pessoal ainda preciso de ajuda... :)
GOSTEI 0
Douglas Dionizio
12/07/2012
?... :)
GOSTEI 0