c# - relacion - mvc entity framework español
Entity Framework Code First: ¿Cómo puedo crear una relación Uno a Muchos Y Uno a Uno entre dos tablas? (2)
Aquí está mi modelo:
public class Customer
{
public int ID { get; set; }
public int MailingAddressID { get; set; }
public virtual Address MailingAddress { get; set; }
public virtual ICollection<Address> Addresses { get; set; }
}
public class Address
{
public int ID { get; set; }
public int CustomerID { get; set; }
public virtual Customer Customer { get; set; }
}
Un cliente puede tener cualquier número de direcciones, sin embargo, solo una de esas direcciones puede ser una dirección de correo.
Puedo obtener la relación One to One y One to Many funcionando bien si solo uso una, pero cuando intento introducir ambas claves, obtengo varias claves CustomerID (CustomerID1, CustomerID2, CustomerID3) en la tabla de Direcciones. Estoy realmente arrancándome el pelo por esto.
Para mapear la relación One to One, estoy utilizando el método descrito aquí http://weblogs.asp.net/manavi/archive/2011/01/23/associations-in-ef-code-first-ctp5-part-3-one-to-one-foreign-key-associations.aspx
He luchado con esto durante casi todo el día y, por supuesto, espero preguntar aquí, ¡justo antes de que finalmente lo descubra!
Además de implementar el One to One como se demuestra en ese blog, también necesitaba usar la API fluida para especificar el Many to Many, ya que la convención por sí sola no era suficiente con la relación One to One presente.
modelBuilder.Entity<Customer>().HasRequired(x => x.PrimaryMailingAddress)
.WithMany()
.HasForeignKey(x => x.PrimaryMailingAddressID)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Address>()
.HasRequired(x => x.Customer)
.WithMany(x => x.Addresses)
.HasForeignKey(x => x.CustomerID);
Y aquí está el modelo final en la base de datos:
Sé que estás tratando de descubrir la forma de Entity Framework de hacer esto, pero si estuviera diseñando esto, recomendaría que ni siquiera conectes MailingAddress a la base de datos. Solo hazlo como una propiedad calculada como esta:
public MailingAddress {
get {
return Addresses.Where(a => a.IsPrimaryMailing).FirstOrDefault();
}
}