8

¿Es posible definir una relación muchos a muchos en Entity Framework 4.1 (primer enfoque de código) usando solo anotaciones de datos, sin el generador de modelos?Primer código de Entity Framework 4.1: defina many-to-many utilizando anotaciones de datos solamente

Por ejemplo, algo como:

Product = { Id, Name, ... } 
Category = { Id, Name, ... } 
ProductCategory = { ProductId, CategoryId } 

se obtiene la imagen.

No quiero tener una entidad intermedia ProductCategory en el contexto con dos varios, ya que no tengo ningún dato adicional, solo los dos FK. Además, debería ser capaz de definir el nombre de la tabla para la tabla intermedia para su uso con una base de datos existente.

Respuesta

11

Es posible definir muchos a muchos con convenciones predeterminadas o con anotaciones de datos, pero no es posible cambiar la asignación a la tabla de unión (nombre y columnas de la tabla) sin el generador de modelos. Sencillo muchos-a-muchos:

public class Product 
{ 
    public int Id { get; set; } 
    public virtual ICollection<Category> Categories { get; set; } 
} 

public class Category 
{ 
    public int Id { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
} 

Para poder utilizar anotaciones que puede utilizar:

public class Product 
{ 
    [Key] 
    public int Id { get; set; } 
    [InverseProperty("Products")] 
    public virtual ICollection<Category> Categories { get; set; } 
} 

public class Category 
{ 
    [Key] 
    public int Id { get; set; } 
    [InverseProperty("Categories")] 
    public virtual ICollection<Product> Products { get; set; } 
} 

Si necesita controlar la asignación de tabla de unión a base de datos existente que necesita modelBuilder. Las anotaciones de datos no son tan potentes como una API fluida.

+0

Gracias, hice lo que sugirió, pero aún no funciona. Por alguna razón, recibo una excepción 'Nombre de columna inválido 'Category_Id'. \ R \ nNombre de columna inválido 'Product_Id'' cuando intento evaluar' product.Categories'. Esto es solo mediante convención, es decir, sin anotaciones ni API fluidas. Mi tabla de base de datos 'ProductsCategories' tiene' ProductId' y 'CategoryId' sin el guión bajo en el medio. ¿Por qué el guión bajo? No está documentado en ninguna parte como una convención AFAIK. EF4.1 no necesita guiones bajos para las relaciones 1-M y M-1 (al menos no está documentado). –

+0

Product_Id y Category_Id son nombres predeterminados. Si tiene una base de datos existente y tiene diferentes nombres, debe usar el generador de modelos para mapear correctamente la relación con su propia tabla. –

+0

Tienes razón. Sin embargo, en otro lugar donde se usan relaciones 1-M, se espera el campo FK * sin * el guión bajo (es decir, 'ProductId'). Eso no tiene sentido**. De hecho, eso significa que si luego agrego otro campo a la tabla intermedia de ProductCategories ("Ord" por ejemplo) se convertirá en una entidad verdadera, y luego la convención se quejará de que no puede encontrar el campo "ProductId". –

Cuestiones relacionadas