none
Dudas Code First RRS feed

  • Pregunta

  • Hola como va?, Hace un tiempo cuando saltaba de antiguos lenguajes, me recomendaron en este foro usar, C#, EF, Linq y en su momento code first. Hice caso de todos menos de code first y en la actualidad uso primero la bd y luego el edmx, segui un pequeño tutorial de microsoft docs sobre code first y me parecio muy interesante. Pero me surgieron algunas dudas. este es el ejemplo que hice lo adapte a mi manera pero es igual al de microsoft

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Data.Entity;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace CodeFirstDatabase
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                using(var db = new BlogContext())
                {
                    var blog = new Blog { Name = txtName.Text };
                    db.Blogs.Add(blog);
                    db.SaveChanges();
    
                    var query = from b in db.Blogs
                                orderby b.Name
                                select b;
    
                    foreach(var item in query)
                    {
                        dataGridView1.Rows.Add(item.Name);
                    }
                }
            }
        }
        public class Blog
        {
            public int BlogId { get; set; }
            public string Name { get; set; }
    
            public virtual List<Post> Posts { get; set; }
        }
        public class Post
        {
            public int PostId { get; set; }
            public string Title { get; set; }
            public string Content { get; set; }
    
            public int BlogId { get; set; }
            public virtual Blog Blog { get; set; }
        }
        public class BlogContext : DbContext
        {
            public DbSet<Blog> Blogs { get; set; }
            public DbSet<Post> Posts { get; set; }
        }
    }

    Bueno ahora voy a enumerar las dudas 

    1-En que momento se crea la bd (ojo no las tablas).

    2-Las clases para armar las tablas en que parte determina cual es el primary key puesto que cuando abro el sql ya estan con sus respectivas claves primarias.

    3-el nombre de la bd es siempre igual al del proyecto?. Se puede cambiar?.

    4-Luego vi el uso de migrations para actualizar la bd y las tablas, a traves de la consola de vs, se puede hacer desde codigo ?.

    5-Como podria verificar si las tablas y la bd estan generadas y de no ser asi generarlas por codigo

    6-En mi caso se creo la base y las tablas en una unica instancia de sqlexpress que tenia corriendo, que pasaria si tengo mas de una instancia se puede dirigir en que instancia instalar ?

    7-En el appconfig en mi caso por ser windows forms, no figura el conection string que se crea cuando agrego un Ado.net entity data model, en la actualidad tengo 2 conection string uno es el servidor donde queda la aplicacion final y el otro es la net donde trabajo. Aqui es donde segun lo que necesito marco y desmarco como comentario el conection string, como determinar por codigo no solo la instancia si no tambien la ubicacion en caso de tener 3 pc con sqlcorriendo.

    Bueno eso es todo, recien empece con code first y me ayudaria mucho entender un poco mas, como siempre agradecido y saludos.

    martes, 20 de noviembre de 2018 13:27

Respuestas

  • Buenas,

    Te dejo un enlace sobre como utilizar la opción CodeFirst, es para EFCore, pero entiendo que en tu caso es lo mismo, y si puedes usar EFCore yo te recomendaría EFCore

    Haciendo fácil el acceso a datos con Entity Framework Core (Parte 2)

    En el post se detallan las maneras de generar la DB y como actualizarla. 

    Si tienes dudas sobre como hacerlo, o no te sirve EFCore y tiene que ser EF6 obligatoriamente, no dudes en preguntar.

    EDITO: Acabo de fijarme que esa entrada la hice para NetCore, pero EFCore trabaja con NetStandard, así que que no te eche para atrás lo de "Core" que es totalmente compatible con .Net Framework (el tradicional de toda la vida). Todo funciona exactamente igual y se usa exactamente igual.

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub

    Mi Blog


    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.




    • Propuesto como respuesta Sergio Parra martes, 20 de noviembre de 2018 14:12
    • Editado Jorge TurradoMVP martes, 20 de noviembre de 2018 14:21
    • Marcado como respuesta EnzoTuc40 martes, 20 de noviembre de 2018 14:43
    martes, 20 de noviembre de 2018 13:44
  • hola

    >>1-En que momento se crea la bd

    depende si usas migrations, pero podrias definir el inicializados en el dbcontext

    Database Initialization Strategies in EF 6 Code-First

    >>2-Las clases para armar las tablas en que parte determina cual es el primary key puesto que cuando abro el sql ya estan con sus respectivas claves primarias.

    existe una converncion para las keys, si la usas no hace falta indicarlo, pero sino podrias usar

    [Entity Framework][Code First] Crear entidad simpl

    yo uso fluent y veras algo como esto

    public class CategoryMap : EntityTypeConfiguration<Category>
    {
        public CategoryMap()
        {
            ToTable("Categories");
     
            HasKey(c => c.CategoryID);
            Property(c => c.CategoryID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
     
            Property(c => c.CategoryName).IsRequired().HasMaxLength(15);
            Property(c => c.Description).HasColumnType("ntext");
     
        }
    }

    si es que quieres indicar el mapping puntualmente

    >>3-el nombre de la bd es siempre igual al del proyecto?.

    usa

    ToTable("Categories");

    para cambiarlo, pero nuevamente sino lo indicas aplican las convenciones

    Convenciones de Code First

    >>4-Luego vi el uso de migrations para actualizar la bd y las tablas, a traves de la consola de vs, se puede hacer desde codigo ?

    se puede si indicas el inializador que hace justamente aplicar migrations

    >>5-Como podria verificar si las tablas y la bd estan generadas y de no ser asi generarlas por codigo

    entiendo que controlando el error, si algo no se creo tendras un exception

    >>6-En mi caso se creo la base y las tablas en una unica instancia de sqlexpress que tenia corriendo, que pasaria si tengo mas de una instancia se puede dirigir en que instancia instalar ?

    lo indicas en el connection string, alli defines el Server al cual te vas a conectar

    >>Aqui es donde segun lo que necesito marco y desmarco como comentario el conection string, como determinar por codigo no solo la instancia si no tambien la ubicacion en caso de tener 3 pc con sqlcorriendo.

    podrias tomar desde el config los cnnection string configurados, listarlos para ser seleccionados y luego enviar el nombre de la key por parametro a la clase BlogContext

    public class BlogContext : DbContext
    {
    	public BlogContext(string keyConnString) 
    		: base(keyConnString)
    	{
    	}
    	
    	public DbSet<Blog> Blogs { get; set; }
    	public DbSet<Post> Posts { get; set; }
    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta EnzoTuc40 martes, 20 de noviembre de 2018 14:43
    martes, 20 de noviembre de 2018 14:24

Todas las respuestas

  • Buenas,

    Te dejo un enlace sobre como utilizar la opción CodeFirst, es para EFCore, pero entiendo que en tu caso es lo mismo, y si puedes usar EFCore yo te recomendaría EFCore

    Haciendo fácil el acceso a datos con Entity Framework Core (Parte 2)

    En el post se detallan las maneras de generar la DB y como actualizarla. 

    Si tienes dudas sobre como hacerlo, o no te sirve EFCore y tiene que ser EF6 obligatoriamente, no dudes en preguntar.

    EDITO: Acabo de fijarme que esa entrada la hice para NetCore, pero EFCore trabaja con NetStandard, así que que no te eche para atrás lo de "Core" que es totalmente compatible con .Net Framework (el tradicional de toda la vida). Todo funciona exactamente igual y se usa exactamente igual.

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub

    Mi Blog


    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.




    • Propuesto como respuesta Sergio Parra martes, 20 de noviembre de 2018 14:12
    • Editado Jorge TurradoMVP martes, 20 de noviembre de 2018 14:21
    • Marcado como respuesta EnzoTuc40 martes, 20 de noviembre de 2018 14:43
    martes, 20 de noviembre de 2018 13:44
  • hola

    >>1-En que momento se crea la bd

    depende si usas migrations, pero podrias definir el inicializados en el dbcontext

    Database Initialization Strategies in EF 6 Code-First

    >>2-Las clases para armar las tablas en que parte determina cual es el primary key puesto que cuando abro el sql ya estan con sus respectivas claves primarias.

    existe una converncion para las keys, si la usas no hace falta indicarlo, pero sino podrias usar

    [Entity Framework][Code First] Crear entidad simpl

    yo uso fluent y veras algo como esto

    public class CategoryMap : EntityTypeConfiguration<Category>
    {
        public CategoryMap()
        {
            ToTable("Categories");
     
            HasKey(c => c.CategoryID);
            Property(c => c.CategoryID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
     
            Property(c => c.CategoryName).IsRequired().HasMaxLength(15);
            Property(c => c.Description).HasColumnType("ntext");
     
        }
    }

    si es que quieres indicar el mapping puntualmente

    >>3-el nombre de la bd es siempre igual al del proyecto?.

    usa

    ToTable("Categories");

    para cambiarlo, pero nuevamente sino lo indicas aplican las convenciones

    Convenciones de Code First

    >>4-Luego vi el uso de migrations para actualizar la bd y las tablas, a traves de la consola de vs, se puede hacer desde codigo ?

    se puede si indicas el inializador que hace justamente aplicar migrations

    >>5-Como podria verificar si las tablas y la bd estan generadas y de no ser asi generarlas por codigo

    entiendo que controlando el error, si algo no se creo tendras un exception

    >>6-En mi caso se creo la base y las tablas en una unica instancia de sqlexpress que tenia corriendo, que pasaria si tengo mas de una instancia se puede dirigir en que instancia instalar ?

    lo indicas en el connection string, alli defines el Server al cual te vas a conectar

    >>Aqui es donde segun lo que necesito marco y desmarco como comentario el conection string, como determinar por codigo no solo la instancia si no tambien la ubicacion en caso de tener 3 pc con sqlcorriendo.

    podrias tomar desde el config los cnnection string configurados, listarlos para ser seleccionados y luego enviar el nombre de la key por parametro a la clase BlogContext

    public class BlogContext : DbContext
    {
    	public BlogContext(string keyConnString) 
    		: base(keyConnString)
    	{
    	}
    	
    	public DbSet<Blog> Blogs { get; set; }
    	public DbSet<Post> Posts { get; set; }
    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta EnzoTuc40 martes, 20 de noviembre de 2018 14:43
    martes, 20 de noviembre de 2018 14:24
  • Gracias a ambos, casualmente fue usted Leandro que me aconsejo, cuando venia de VB6 y la verdad que quede muy conforme con C#, EF Linq, bueno ahora a instruirse un poco con code first como aquella vez con C# de nuevo gracias.
    martes, 20 de noviembre de 2018 14:45