Usuário com melhor resposta
Erro Não foi possível atualizar o EntitySet 'ANALISELC' porque ele possui uma DefiningQuery

Pergunta
-
Bom dia pessoal. Estou com um probleminha aqui que não consigo achar de jeito nenhum. Não consigo adicionar nada em uma tabela do meu banco, sempre que eu salvo as alterações dá um erro:
Não foi possível atualizar o EntitySet 'ANALISELC' porque ele possui uma DefiningQuery e não existe nenhum elemento <InsertFunction> no elemento <ModificationFunctionMapping> para oferecer suporte à operação atual.
Minha estrutura está no link "agenciabis.com.br/estrutura.jpg" pois não consigo postar aqui, por ser uma conta nova.
O código:
ANALISE analise = BD_ETA.ANALISE.Find(24); PONTOCAPTACAO ponto = BD_ETA.PONTOCAPTACAO.Find(18); ANALISELC item = new ANALISELC(); item.PONTOCAPTACAO = ponto; item.ANALISE = analise; item.DataHora = DateTime.Now; item.Vazao = 0; item.AnaliseValor = 0; item.OPERADOR_OperadorId = 1041; item.HoraLc = TimeSpan.Parse("00:02:00"); item.Situacao = "A"; analise.ANALISELC.Add(item); BD_ETA.SaveChanges();
e também fiz assim:
ANALISE analise = BD_ETA.ANALISE.Find(24); PONTOCAPTACAO ponto = BD_ETA.PONTOCAPTACAO.Find(18); ANALISELC item = new ANALISELC(); item.PONTOCAPTACAO = ponto; item.ANALISE = analise; item.DataHora = DateTime.Now; item.Vazao = 0; item.AnaliseValor = 0; item.OPERADOR_OperadorId = 1041; item.HoraLc = TimeSpan.Parse("00:02:00"); item.Situacao = "A"; BD_ETA.ANALISELC.Add(item); BD_ETA.SaveChanges();
mas não deu certo de jeito nenhum. Alguém ai já passou por isso?
Respostas
-
Olá funcionou alterando o mapeamento veja como ficou :
using (var db = new TesteEFContext()) { var ponto = db.PONTOCAPTACAOs.First(i => i.PontoCaptacaoId > 0); var analise = db.ANALISEs.First(i => i.AnaliseId > 0); ANALISELC item = new ANALISELC(); item.PONTOCAPTACAO = ponto; item.ANALISE = analise; item.DataHora = DateTime.Now; item.Vazao = 2; item.AnaliseValor = 3; item.OPERADOR_OperadorId = 1; item.Situacao = "3"; item.HoraLc = new TimeSpan(); db.ANALISELCs.Add(item); db.Entry(item).State = EntityState.Added; db.SaveChanges(); }
O Mapping como ficou eu usei DataBaseFirst para gerar as entidades :
using System.ComponentModel.DataAnnotations.Schema; using System.Data.Entity.ModelConfiguration; namespace EFMSDN.Models.Mapping { public class ANALISELCMap : EntityTypeConfiguration<ANALISELC> { public ANALISELCMap() { // Primary Key this.HasKey(t => new { t.Id}); // Properties this.Property(t => t.Id) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); this.Property(t => t.PONTOCAPTACAO_PontoCaptacaoId) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); this.Property(t => t.ANALISE_AnaliseId) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); this.Property(t => t.AnaliseValor) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); this.Property(t => t.OPERADOR_OperadorId) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); this.Property(t => t.Situacao) .IsRequired() .HasMaxLength(1); // Table & Column Mappings this.ToTable("ANALISELC"); this.Property(t => t.Id).HasColumnName("Id"); this.Property(t => t.PONTOCAPTACAO_PontoCaptacaoId).HasColumnName("PONTOCAPTACAO_PontoCaptacaoId"); this.Property(t => t.ANALISE_AnaliseId).HasColumnName("ANALISE_AnaliseId"); this.Property(t => t.DataHora).HasColumnName("DataHora"); this.Property(t => t.Vazao).HasColumnName("Vazao"); this.Property(t => t.AnaliseValor).HasColumnName("AnaliseValor"); this.Property(t => t.OPERADOR_OperadorId).HasColumnName("OPERADOR_OperadorId"); this.Property(t => t.Situacao).HasColumnName("Situacao"); this.Property(t => t.HoraLc).HasColumnName("HoraLc"); // Relationships this.HasRequired(t => t.ANALISE) .WithMany(t => t.ANALISELCs) .HasForeignKey(d => d.ANALISE_AnaliseId); this.HasRequired(t => t.PONTOCAPTACAO) .WithMany(t => t.ANALISELCs) .HasForeignKey(d => d.PONTOCAPTACAO_PontoCaptacaoId); } } }
Pois o que vi foi que o EF me gerou todos os campos como PK Eu retirei e deixei apenas o Id que foi o mostrado pela sua estrutura da sua tabela.
- Marcado como Resposta Yuri Tomé segunda-feira, 5 de maio de 2014 12:14
Todas as Respostas
-
-
Não ! Testei aqui e deveria funcionar ! Como está essas tabelas em codigo criado pelo Entity ?
No banco de dados todas essas tabelas tem chave primaria certo ?
Poste o codigo dessas tabelas que o Entity Criou.
E veja também se sua variável ponto e analise não são nulas quando vc faz o select usando o Find.- Editado Daniel Brito br terça-feira, 29 de abril de 2014 18:27
-
Sim, todas as tabelas tem chave, minha estrutura está em "agenciabis.com.br/estrutura.jpg".
os valores das variáveis ponto e analise não são nulas.
Segue o código das tabelas:
public partial class ANALISELC { public int Id { get; set; } public int PONTOCAPTACAO_PontoCaptacaoId { get; set; } public int ANALISE_AnaliseId { get; set; } public System.DateTime DataHora { get; set; } public float Vazao { get; set; } public int AnaliseValor { get; set; } public int OPERADOR_OperadorId { get; set; } public string Situacao { get; set; } public System.TimeSpan HoraLc { get; set; } public virtual ANALISE ANALISE { get; set; } public virtual PONTOCAPTACAO PONTOCAPTACAO { get; set; } } public partial class ANALISE { public ANALISE() { this.ANALISELC = new HashSet<ANALISELC>(); } public int AnaliseId { get; set; } public int ANALISEGRUPO_AnaliseGrupoId { get; set; } public string AnaliseDescr { get; set; } public string Unidade { get; set; } public float ValorMaximo { get; set; } public float ValorMinimo { get; set; } public float Meta { get; set; } public virtual ANALISEGRUPO ANALISEGRUPO { get; set; } public virtual ICollection<ANALISELC> ANALISELC { get; set; } } public partial class PONTOCAPTACAO { public PONTOCAPTACAO() { this.ANALISELC = new HashSet<ANALISELC>(); } public int PontoCaptacaoId { get; set; } public string PontoCaptacaoDescr { get; set; } public virtual ICollection<ANALISELC> ANALISELC { get; set; } }
-
-
Segue os campos desse banco, o EF é 5.0.0.0
CREATE TABLE [dbo].[ANALISELC] ( [Id] INT IDENTITY (1, 1) NOT NULL, [PONTOCAPTACAO_PontoCaptacaoId] INT NOT NULL, [ANALISE_AnaliseId] INT NOT NULL, [DataHora] DATETIME NOT NULL, [Vazao] REAL NOT NULL, [AnaliseValor] INT NOT NULL, [OPERADOR_OperadorId] INT NOT NULL, [Situacao] NVARCHAR (1) NOT NULL, [HoraLc] TIME (7) NOT NULL, CONSTRAINT [ANALISELC_FKIndex1] FOREIGN KEY ([ANALISE_AnaliseId]) REFERENCES [dbo].[ANALISE] ([AnaliseId]), CONSTRAINT [ANALISELC_FKIndex2] FOREIGN KEY ([PONTOCAPTACAO_PontoCaptacaoId]) REFERENCES [dbo].[PONTOCAPTACAO] ([PontoCaptacaoId]) ); CREATE TABLE [dbo].[ANALISE] ( [AnaliseId] INT IDENTITY (1, 1) NOT NULL, [ANALISEGRUPO_AnaliseGrupoId] INT NOT NULL, [AnaliseDescr] VARCHAR (50) NOT NULL, [Unidade] VARCHAR (20) NOT NULL, [ValorMaximo] REAL NOT NULL, [ValorMinimo] REAL NOT NULL, [Meta] REAL NOT NULL, PRIMARY KEY CLUSTERED ([AnaliseId] ASC), CONSTRAINT [ANALISE_FKIndex1] FOREIGN KEY ([ANALISEGRUPO_AnaliseGrupoId]) REFERENCES [dbo].[ANALISEGRUPO] ([AnaliseGrupoId]) ); CREATE TABLE [dbo].[ANALISEGRUPO] ( [AnaliseGrupoId] INT IDENTITY (1, 1) NOT NULL, [AnaliseGrupoDescr] VARCHAR (50) NOT NULL, PRIMARY KEY CLUSTERED ([AnaliseGrupoId] ASC) ); CREATE TABLE [dbo].[PONTOCAPTACAO] ( [PontoCaptacaoId] INT IDENTITY (1, 1) NOT NULL, [PontoCaptacaoDescr] VARCHAR (50) NOT NULL, PRIMARY KEY CLUSTERED ([PontoCaptacaoId] ASC) );
- Editado Yuri Tomé quarta-feira, 30 de abril de 2014 13:23
-
-
Olá funcionou alterando o mapeamento veja como ficou :
using (var db = new TesteEFContext()) { var ponto = db.PONTOCAPTACAOs.First(i => i.PontoCaptacaoId > 0); var analise = db.ANALISEs.First(i => i.AnaliseId > 0); ANALISELC item = new ANALISELC(); item.PONTOCAPTACAO = ponto; item.ANALISE = analise; item.DataHora = DateTime.Now; item.Vazao = 2; item.AnaliseValor = 3; item.OPERADOR_OperadorId = 1; item.Situacao = "3"; item.HoraLc = new TimeSpan(); db.ANALISELCs.Add(item); db.Entry(item).State = EntityState.Added; db.SaveChanges(); }
O Mapping como ficou eu usei DataBaseFirst para gerar as entidades :
using System.ComponentModel.DataAnnotations.Schema; using System.Data.Entity.ModelConfiguration; namespace EFMSDN.Models.Mapping { public class ANALISELCMap : EntityTypeConfiguration<ANALISELC> { public ANALISELCMap() { // Primary Key this.HasKey(t => new { t.Id}); // Properties this.Property(t => t.Id) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); this.Property(t => t.PONTOCAPTACAO_PontoCaptacaoId) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); this.Property(t => t.ANALISE_AnaliseId) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); this.Property(t => t.AnaliseValor) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); this.Property(t => t.OPERADOR_OperadorId) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); this.Property(t => t.Situacao) .IsRequired() .HasMaxLength(1); // Table & Column Mappings this.ToTable("ANALISELC"); this.Property(t => t.Id).HasColumnName("Id"); this.Property(t => t.PONTOCAPTACAO_PontoCaptacaoId).HasColumnName("PONTOCAPTACAO_PontoCaptacaoId"); this.Property(t => t.ANALISE_AnaliseId).HasColumnName("ANALISE_AnaliseId"); this.Property(t => t.DataHora).HasColumnName("DataHora"); this.Property(t => t.Vazao).HasColumnName("Vazao"); this.Property(t => t.AnaliseValor).HasColumnName("AnaliseValor"); this.Property(t => t.OPERADOR_OperadorId).HasColumnName("OPERADOR_OperadorId"); this.Property(t => t.Situacao).HasColumnName("Situacao"); this.Property(t => t.HoraLc).HasColumnName("HoraLc"); // Relationships this.HasRequired(t => t.ANALISE) .WithMany(t => t.ANALISELCs) .HasForeignKey(d => d.ANALISE_AnaliseId); this.HasRequired(t => t.PONTOCAPTACAO) .WithMany(t => t.ANALISELCs) .HasForeignKey(d => d.PONTOCAPTACAO_PontoCaptacaoId); } } }
Pois o que vi foi que o EF me gerou todos os campos como PK Eu retirei e deixei apenas o Id que foi o mostrado pela sua estrutura da sua tabela.
- Marcado como Resposta Yuri Tomé segunda-feira, 5 de maio de 2014 12:14