ef code first - the - Primer código de EF: relación opcional de 1 a 1
one to one ef 6 (1)
Quiero mapear una relación opcional de 1 a 1 en una base de datos existente con EF Code First.
Esquema simple:
User
Username
ContactID
Contact
ID
Name
Obviamente ContactID se une a Contact.ID. El campo ContactID es anulable, por lo que la relación es opcional: 0 o 1, nunca muchos.
Entonces, ¿cómo especifico esta relación en EF Code First, con este esquema existente?
Esto es lo que he intentado hasta ahora:
public class User
{
[Key]
public string Username { get; set; }
public int? ContactID { get; set; }
[ForeignKey("ContactID")]
public virtual Contact Contact { get; set; }
}
public class Contact
{
[Key]
public int ID { get; set; }
public string Name { get; set; }
public virtual User User { get; set; }
}
modelBuilder.Entity<User>().HasOptional<Contact>(u=> u.Contact)
.WithOptionalDependent(c => c.User);
Obtengo la siguiente excepción:
System.Data.Edm.EdmAssociationEnd: : Multiplicity is not valid in Role
''User_Contact_Source'' in relationship ''User_Contact''. Because the Dependent
Role properties are not the key properties, the upper bound of the multiplicity
of the Dependent Role must be *.
Una solución sería;
public class User
{
[Key]
public string Username { get; set; }
public virtual Contact Contact { get; set; }
}
public class Contact
{
[Key]
public int ID { get; set; }
public string Name { get; set; }
public virtual User User { get; set; }
}
modelBuilder.Entity<User>()
.HasOptional<Contact>(u => u.Contact)
.WithOptionalDependent(c => c.User).Map(p => p.MapKey("ContactID"));
Establece solo sus objetos de navegación en sus POCO y en su lugar utiliza una API fluida para asignar su clave a la columna correcta.