none
Erro de mapeamento RRS feed

  • Pergunta

  • Bom dia a todos, estou penando numa situação de mapeamento que utilizei da mesma técnica apresentada no vídeo do site oficial (http://msdn.microsoft.com/pt-br/data/jj200620).

    Tenho a classe:

    namespace ws.mdf.dominio
    {
        public partial class Usuario
        {
            public int id;
            public string nomecompleto;
            public DateTime dtnasc;
            public string cpfcnpj;
            public string email;
            public string usuario;
            public string senha;
            public string foto;
        }
    }

    Tenho o seguinte Context:

    public class MdfContext : DbContext
        {
            static MdfContext()
            {
                Database.SetInitializer<MdfContext>(null);
            }
    
            public MdfContext()
                : base("name:mdfmain")
            {
    
            }
    
            public DbSet<Usuario> Usuarios { get; set; }
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Configurations.Add(new UsuarioMap());
            }        
        }

    Tenho o mapeamento:

    public class UsuarioMap : EntityTypeConfiguration<Usuario>
        {
            public UsuarioMap()
            {
                // Primary Key
                this.HasKey(t => t.id);
    
                // Properties
                this.Property(t => t.usuario)
                    .IsRequired()
                    .HasMaxLength(50);
    
                this.Property(t => t.senha)
                    .IsRequired()
                    .HasMaxLength(250);
    
                this.Property(t => t.nomecompleto)
                    .IsRequired()
                    .HasMaxLength(250);
    
                this.Property(t => t.cpfcnpj)
                    .HasMaxLength(50);
    
                this.Property(t => t.email)
                    .IsRequired()
                    .HasMaxLength(250);
    
                this.Property(t => t.foto)
                    .HasMaxLength(250);
    
                // Table & Column Mappings
                this.ToTable("Usuario");
                this.Property(t => t.id).HasColumnName("id");
                this.Property(t => t.usuario).HasColumnName("usuario");
                this.Property(t => t.senha).HasColumnName("senha");
                this.Property(t => t.nomecompleto).HasColumnName("nomecompleto");
                this.Property(t => t.dtnasc).HasColumnName("dtnasc");
                this.Property(t => t.cpfcnpj).HasColumnName("cpfcnpj");
                this.Property(t => t.email).HasColumnName("email");
                this.Property(t => t.foto).HasColumnName("foto");
            }
        }

    E tenho o seguinte erro:

    The properties expression 't => t.id' is not valid. The expression should represent a property: C#: 't => t.MyProperty'  VB.Net: 'Function(t) t.MyProperty'. When specifying multiple properties use an anonymous type: C#: 't => new { t.MyProperty1, t.MyProperty2 }'  VB.Net: 'Function(t) New With { t.MyProperty1, t.MyProperty2 }'.

    O que eu consegui ver até o momento:

    Fazendo exatamente do jeito que o site indica funciona, pois no exemplo do site, o a classe Usuario está no mesmo domínio da classe de mapeamento, depois de vários testes foi a unica diferença que eu encontrei, mas eu sei que tem uma forma de fazer o mapeamento colocando a minha classe de domínio em um Domain separado da classes de Dados (onde estão o mapeamento).

    Deve ser uma besteira, mas ja perdi uma madrugada com isso...

    domingo, 21 de abril de 2013 16:39

Respostas

  • Wallace,

    Mais uma coisa importante, o DataAnnotations não consegue mapear algumas coisas, em muitos casos você será obrigado à usar a API Fluent, mas neste seu exemplo simples não há necessidade, mas se mesmo assim você quiser entender as diferenças, para que a seu código funcione você precisa definir os campos da tabela Usuário como propriedades em sua classe, a classe Usuário deve ser criada assim:

    public partial class Usuario
        {
            public int id { get; set; }
            public string nomecompleto { get; set; }
            public DateTime dtnasc { get; set; }
            public string cpfcnpj { get; set; }
            public string email { get; set; }
            public string usuario { get; set; }
            public string senha { get; set; }
            public string foto { get; set; }
        }


    Att,
    Leandro

    Se foi útil, marque como útil ou como resposta.


    segunda-feira, 22 de abril de 2013 12:51

Todas as Respostas

  • Wallace,

    Bom dia!

    Por que você não utiliza DataAnnotations, assim você elimina sua classe UserMap:

        public partial class Usuario
        {
            [Key]
            public int id;
            [Required, MaxLength(250)]
            public string nomecompleto;
            public DateTime dtnasc;
            [MaxLength(50)]
            public string cpfcnpj;
            [Required, MaxLength(250)]
            public string email;
            [Required, MaxLength(50)]
            public string usuario;
            [Required, MaxLength(250)]
            public string senha;
            [MaxLength(250)]
            public string foto;
        }


    Att,
    Leandro

    Se foi útil, marque como útil ou como resposta.

    • Sugerido como Resposta Leandro Tozetto segunda-feira, 22 de abril de 2013 12:04
    segunda-feira, 22 de abril de 2013 12:04
  • Leandro,

    Então bastaria eu fazer a chamada direta da minha classe no BdContext?

     modelBuilder.Configurations.Add(new Usuario());

    Como no exemplo que coloquei acima?

    Att,

    Wallace

    segunda-feira, 22 de abril de 2013 12:29
  • Wallace,

    Na verdade você pode eliminar este trecho de código do seu contexto:

     protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Configurations.Add(new UsuarioMap());
            } 


    Att,
    Leandro

    Se foi útil, marque como útil ou como resposta.

    segunda-feira, 22 de abril de 2013 12:44
  • Wallace,

    Mais uma coisa importante, o DataAnnotations não consegue mapear algumas coisas, em muitos casos você será obrigado à usar a API Fluent, mas neste seu exemplo simples não há necessidade, mas se mesmo assim você quiser entender as diferenças, para que a seu código funcione você precisa definir os campos da tabela Usuário como propriedades em sua classe, a classe Usuário deve ser criada assim:

    public partial class Usuario
        {
            public int id { get; set; }
            public string nomecompleto { get; set; }
            public DateTime dtnasc { get; set; }
            public string cpfcnpj { get; set; }
            public string email { get; set; }
            public string usuario { get; set; }
            public string senha { get; set; }
            public string foto { get; set; }
        }


    Att,
    Leandro

    Se foi útil, marque como útil ou como resposta.


    segunda-feira, 22 de abril de 2013 12:51