Cómo agregar claves foráneas en EF 7 alpha

entity-framework-core

Pregunta

¿Cómo hago una relación uno a uno en EF 7 alpha3?

La forma antigua de solo definir las propiedades de navegación no funciona, y el modelBuilder no tiene los métodos HasRequired / HasOptional utilizados anteriormente.

¿Alguien puede arrojar algo de luz sobre eso?

Respuesta aceptada

Hasta hace poco, no había ninguna API de constructor de modelos para definir relaciones. En su lugar, debe manipular el objeto modelBuilder.Model subyacente. Aquí hay un ejemplo de una relación de uno a muchos.

class Blog
{
    public Blog()
    {
        Posts = new List<Post>();
    }

    public int Id { get; set; }

    public ICollection<Post> Posts { get; set; }
}

class Post
{
    public int Id { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

class BlogContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<Post>().ForeignKeys(x => x.ForeignKey<Blog>(p => p.BlogId));

        var model = builder.Model;
        var blog = model.GetEntityType(typeof(Blog));
        var post = model.GetEntityType(typeof(Post));
        var fk = post.ForeignKeys.Single(k => k.ReferencedEntityType == blog);
        blog.AddNavigation(new Navigation(fk, "Posts", pointsToPrincipal: false));
        post.AddNavigation(new Navigation(fk, "Blog", pointsToPrincipal: true));
    }
}

Puede leer más acerca de nuestro pensamiento actual (a partir de 2014-07-31) sobre cómo se verán estas API . El resultado final sería similar al siguiente.

class Blog
{
    public Blog()
    {
        Posts = new List<Post>();
    }

    public int Id { get; set; }

    public ICollection<Post> Posts { get; set; }
}

class Post
{
    public int Id { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

class BlogContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<Post>().ForeignKeys(x => x.ForeignKey<Blog>(p => p.BlogId));

        var model = builder.Model;
        var blog = model.GetEntityType(typeof(Blog));
        var post = model.GetEntityType(typeof(Post));
        var fk = post.ForeignKeys.Single(k => k.ReferencedEntityType == blog);
        blog.AddNavigation(new Navigation(fk, "Posts", pointsToPrincipal: false));
        post.AddNavigation(new Navigation(fk, "Blog", pointsToPrincipal: true));
    }
}

Respuesta popular

Con EF7 beta7, se introducen nuevos métodos para definir relaciones entre entidades.

Para una relación a muchos,

modelBuilder.Entity<Post>()
   .Reference(typeof(Blog), "Blog")
   .InverseCollection("Posts")
   .ForeignKey(new string[] { "BlogId" });

Con, se configura la relación .Reference(typeof(Blog), "Blog") de Entity Post to Blog . El primer argumento es el tipo de entidad a la que apuntan los Postes y el segundo argumento es el nombre de la propiedad de navegación.

Con, .InverseCollection("Posts") , se configura una relación de muchos a muchos. El argumento de esta función es el nombre de la colección de navegación.

Con, .ForeignKey(new string[] { "BlogId" }) , se configura la clave foránea. Si esta clave externa no está establecida, entonces la clave externa oculta se genera automáticamente para usted.




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué