Esto debería ser una pregunta simple para el usuario de EF versado.Asignación de muchas a muchas relaciones con referencia de clave externa
Tengo el siguiente esquema (en mi cabeza) de cómo deberían verse las relaciones entre las tablas.
[FooBar] [Foo] [Bar]
FooId PK,FK Id PK Id PK
BarId PK,FK BarId FK Name
IsRead Name Description
Description
Sin embargo, cuando intento generar el esquema utilizando EF-código primero se produce un error de interpretar las relaciones entre las entidades como los he interpreté (agrega clave externa FooId
a la mesa [bar]
) y falla para crear completamente la tabla de puente [FooBar]
.
Si alguien pudiera guiarme sobre cómo lograr el esquema anterior utilizando el código EF4, lo agradecería. Si la solución implica atributos en mis modelos POCO, las configuraciones fluidas o un híbrido de ambos no importa mucho, siempre que se cree el esquema de base de datos deseado.
ModelosPoco:
public class Foo
{
public int Id { get; set; }
public string Text { get; set; }
public string Description { get; set; }
public int BarId { get; set; }
public Bar Bar { get; set; } /* bar entity */
public virtual ICollection<Bar> BridgedBars { get; set; }
public Foo()
{
Bars = new List<Bar>();
}
}
public class Bar
{
public int Id { get; set; }
public string Text { get; set; }
public string Description { get; set; }
public virtual ICollection<Foo> Foos { get; set; }
public virtual ICollection<Foo> BridgedFoos { get; set; }
public Bar()
{
Foos = new List<Foo>();
BridgedFoos = new List<Foo>();
}
}
public class FooBar
{
public int FooId { get; set; }
public int BarId { get; set; }
public virtual Foo Foo { get; set; }
public virtual Bar Bar { get; set; }
public bool IsRead { get; set; }
}
Como tener una propiedad (IsRead) en la relación FooBar que probablemente desee establecer desde el código, tanto Foo como Bar necesitan que sus colecciones relacionadas sean FooBars. Una vez que mapea las propiedades en ambos extremos (es decir, las colecciones virtuales en Foo y Bar) a FooBar EF debe crear la relación correctamente. Utilice HasMany(). WithRequired() para asignar cada clase a FooBar. –