none
Erro Não foi possível atualizar o EntitySet 'ANALISELC' porque ele possui uma DefiningQuery RRS feed

  • 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?

    terça-feira, 29 de abril de 2014 17:36

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
    sexta-feira, 2 de maio de 2014 14:43

Todas as Respostas

  • Olá está faltando vc preencher as váriaveis PontoCaptacaoId,AnaliseId !

       Provavelmente é isso caso não for ! Poste sua  classe de Contexto como está essa classe ANALISELC no código !

      

     

    terça-feira, 29 de abril de 2014 17:42
  • 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.
    terça-feira, 29 de abril de 2014 18:24
  • 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; }
        }

    terça-feira, 29 de abril de 2014 19:58
  • Olá, eu testei e funcionou ! Passe os scripts dessas tabelas ! Deve estar faltando chaves PK ! 

    Passe os scrpits das tabelas e qual versão do EF você usa !

    quarta-feira, 30 de abril de 2014 12:05
  • 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
    quarta-feira, 30 de abril de 2014 13:20
  • Vou testar logo mais te dou feedback...
    sexta-feira, 2 de maio de 2014 02:55
  • 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
    sexta-feira, 2 de maio de 2014 14:43