¿Cómo manejar estos dos modelos en el primer enfoque de código utilizando Entity Framework 7?

asp.net-core c# entity-framework entity-framework-core jointable

Pregunta

Problema

Estoy codificando la prueba de concepto ASP.NET 5 MVC6 que simulará una biblioteca. Estoy usando CTP6 y beta3.

¿Cómo definir su relación en Entity Framework 7 utilizando el enfoque de código primero?

Estantería y libros necesitan una mesa de unión. Como lo veo, esta aplicación considerará un estante a la vez y los libros sobre ese mismo yo. En otras palabras, un estante tiene una relación de uno a muchos con los libros.

Modelos

Modelo de estante:

public class Shelf
{
    public int ShelfId { get; set; }

    public string ShelfName { get; set; }

    public ShelfType MyProperty { get; set; }

    public virtual List<Book> Books { get; set; }

    public DateTime Created { get; set; }

    public string CreatedBy { get; set; }

    public DateTime Updated { get; set; }

    public string UpdatedBy { get; set; }

}

Modelo de libro

public class Shelf
{
    public int ShelfId { get; set; }

    public string ShelfName { get; set; }

    public ShelfType MyProperty { get; set; }

    public virtual List<Book> Books { get; set; }

    public DateTime Created { get; set; }

    public string CreatedBy { get; set; }

    public DateTime Updated { get; set; }

    public string UpdatedBy { get; set; }

}

Gol

Me gustaría implementar algo como esto en ASP.NET 5. Dado que TPH y otras funciones aún no están implementadas en EF7, ¿estoy en el camino correcto?

En otras palabras, estoy pensando lo siguiente:

  • ShelfBookViewModel (después de todo, necesito un modelo de vista para mostrar un estante y los libros, o el libro y ser capaz de enganchar de nuevo al estante). Probablemente solo lo nombraré ShelfBook. Este parece ser el enfoque equivocado.
  • Preferiría que EF7 pudiera descubrir que tengo una combinación y crear modelos de vista para inquietudes separadas. De lo contrario, esto es una violación de las prácticas de código SOLID. Algo parecido a lo dado abajo (desde el enlace anterior).
  • ¿Las tablas de unirse aún no se han implementado en EF7 y estoy preguntando en vano?

No he podido hacer funcionar lo siguiente como se muestra a continuación:

public class Shelf
{
    public int ShelfId { get; set; }

    public string ShelfName { get; set; }

    public ShelfType MyProperty { get; set; }

    public virtual List<Book> Books { get; set; }

    public DateTime Created { get; set; }

    public string CreatedBy { get; set; }

    public DateTime Updated { get; set; }

    public string UpdatedBy { get; set; }

}

Gracias por su tiempo en leer mi pregunta. Espero que a otros les resulte útil.

Respuesta popular

Para responder a su pregunta acerca de muchos a muchos, debe definir su asignación de la siguiente manera (y, necesariamente, actualizar sus clases modelo):

modelBuilder.Entity<Shelf>() 
    .HasMany(p => p.Books) 
    .WithMany(t => t.Shelves) // doesn't exist 
    .Map(mc => 
       { 
           mc.ToTable("BookShelves"); 
           mc.MapLeftKey("ShelfId"); 
           mc.MapRightKey("BookId"); 
       });

lo que requeriría que agregue un ICollection<Shelf> Shelves { get; set; } para Book . Pero, si lo hicieras, tendrías lo siguiente (esta es mi versión de MCVE de tu ejemplo):

modelBuilder.Entity<Shelf>() 
    .HasMany(p => p.Books) 
    .WithMany(t => t.Shelves) // doesn't exist 
    .Map(mc => 
       { 
           mc.ToTable("BookShelves"); 
           mc.MapLeftKey("ShelfId"); 
           mc.MapRightKey("BookId"); 
       });

y luego ya no necesitaría la asignación, ya que EF generaría todas las relaciones por convención, incluida la tabla de unión que solo sería visible en la base de datos.

Sin embargo, de sus clases modelo reales y su discusión en torno a ellas, parece que realmente solo necesita de uno a muchos, en cuyo caso, debe aceptar la respuesta de Pynt e ignorar la mía.

EDITAR

Como lo señaló Gert Arnold en los comentarios, EF7 actualmente (¿ya no?) Admite tablas de unión generadas, lo que significa que tendremos que rodar las nuestras, lo que probablemente sea mejor de todos modos .

De aquí en adelante, creo que podría hacer mis propias tablas de una manera simple, si EF ya no las hará por mí (advertencia: solo estoy tratando de cerrar el ciclo sobre este problema ... molestándose en probar esto en un compilador, así que YMMV):

modelBuilder.Entity<Shelf>() 
    .HasMany(p => p.Books) 
    .WithMany(t => t.Shelves) // doesn't exist 
    .Map(mc => 
       { 
           mc.ToTable("BookShelves"); 
           mc.MapLeftKey("ShelfId"); 
           mc.MapRightKey("BookId"); 
       });



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é