Usuário com melhor resposta
Erro de mapeamento

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...
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,
LeandroSe foi útil, marque como útil ou como resposta.
- Sugerido como Resposta Leandro Tozetto segunda-feira, 22 de abril de 2013 12:51
- Editado Leandro Tozetto segunda-feira, 22 de abril de 2013 12:55
- Marcado como Resposta Wallace Damião sábado, 8 de junho de 2013 06:29
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,
LeandroSe foi útil, marque como útil ou como resposta.
- Sugerido como Resposta Leandro Tozetto segunda-feira, 22 de abril de 2013 12:04
-
-
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,
LeandroSe foi útil, marque como útil ou como resposta.
-
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,
LeandroSe foi útil, marque como útil ou como resposta.
- Sugerido como Resposta Leandro Tozetto segunda-feira, 22 de abril de 2013 12:51
- Editado Leandro Tozetto segunda-feira, 22 de abril de 2013 12:55
- Marcado como Resposta Wallace Damião sábado, 8 de junho de 2013 06:29