none
Caso de Estudo EF 6 e Migrations RRS feed

  • Pergunta

  • Caros. 

       Preciso de uma ajuda.

    Estou fazendo um caso de estudo para implementar uma estrutura de desenvolvimento em um projeto, mas estou com alguns probleminhas.

      Bom, vou começar.

      O caso de estudo usa o EF 6 com Migrations em modo 'Auto'.

      Tenho a entidade Contato que possui um FK Aluno_Codigo, quando coloco a propriedade Aluno (virtual property) o Migration cria a coluna Aluno_Codigo no banco, mas cria como nullable, sendo que o certo seria not null, por que em Aluno o campo Código é not null.

      Se eu colocar o campo forçado Aluno_Codigo e a virtual property Aluno o Migration cria dois campos: Aluno_Codigo e Aluno_Codigo1.

       Poderiam me ajudar com esse caso, pois trabalharei em uma estrutura de dados um pouco grande e com essas tecnologias diminuiria o tempo de desenvolvimento e criação do banco, sendo que as atualizações de versão seriam mais rápidas e unificadas.

    Poderiam me dizer o que está faltando para que o EF e o Migrations se entendam com as configurações?

    Grato.  Segue abaixo os códigos.

    Entidade Aluno

    public class Aluno
        {
            public Int64 Codigo { get; set; }
            public string Nome { get; set; }
            public int Idade { get; set; }
            public DateTime DataNascimento { get; set; }
    
            public virtual ICollection<Disciplina> Disciplina { get; set; }
            public virtual ICollection<Contato> Contato { get; set; } 
        }
    
       public class AlunoEntityTypeConfiguration : EntityTypeConfiguration<Aluno>
       {
           public AlunoEntityTypeConfiguration()
           {
              
           }
       }


    Entidade Contato

    public class Contato
        {
            public int Codigo { get; set; }
    
            //public Int64 Aluno_Codigo { get; set; }
    
            public virtual Aluno Aluno { get; set; }
            public string Valor { get; set; }
        }
    
        public class ContatoEntityTypeConfiguration : EntityTypeConfiguration<Contato>
        {
            public ContatoEntityTypeConfiguration()
            {
    
            }
        }

    Meu contexto 

    namespace EstudoEF6Console
    {
        public class EstudoEF6DbContext: DbContext
        {
            static EstudoEF6DbContext()
            {
                //Database.SetInitializer(new MigrateDatabaseToLatestVersion<EstudoEF6DbContext, Migrations.Configuration>());
                Database.SetInitializer(new DropCreateDatabaseIfModelChanges<EstudoEF6DbContext>());
            }
    
            public EstudoEF6DbContext()
            {
                base.Configuration.LazyLoadingEnabled = false;
            }
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
    
                modelBuilder.Configurations.AddFromAssembly(System.Reflection.Assembly.GetExecutingAssembly());
                
                modelBuilder.Conventions.Add(new Convencoes.ChavePrimariaConvention());
                //modelBuilder.Conventions.Add(new Convencoes.ChaveEstrangeiraConvention());
                modelBuilder.Conventions.Add(new Convencoes.NormalizandoTiposConvention());
    
                modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
                //modelBuilder.Conventions.Remove<NavigationPropertyNameForeignKeyDiscoveryConvention>();
            }
        }
    }

    E meu Migrations

    internal sealed class Configuration : DbMigrationsConfiguration<EstudoEF6Console.EstudoEF6DbContext>
        {
            public Configuration()
            {
                AutomaticMigrationsEnabled = true;
            }
    
            protected override void Seed(EstudoEF6Console.EstudoEF6DbContext context)
            {
                //  This method will be called after migrating to the latest version.
    
                //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
                //  to avoid creating duplicate seed data. E.g.
                //
                //    context.People.AddOrUpdate(
                //      p => p.FullName,
                //      new Person { FullName = "Andrew Peters" },
                //      new Person { FullName = "Brice Lambson" },
                //      new Person { FullName = "Rowan Miller" }
                //    );
                //
            }
        }



    quarta-feira, 13 de maio de 2015 21:11

Respostas

  • Diogo, usa o DataAnnotation.

    Ficaria assim:

    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    
    public class Contato
        {
            public int Codigo { get; set; }
            
            [Required]
            public Int64 Aluno_Codigo { get; set; }
    
    
            [ForeignKey("Aluno_Codigo")]
            public virtual Aluno Aluno { get; set; }
    
            public string Valor { get; set; }
        }

    quinta-feira, 14 de maio de 2015 00:58