Tengo una tabla UserForms que tiene dos claves externas a una tabla de Países, pero al crear mi controlador y crear una vista (para el modelo de UserForms) no aparecen los dos campos vinculados a las claves externas. ¿Qué debo hacer para solucionar este problema? A continuación se presentan los dos modelos:
public class UserForms
{
public int Id { get; set; }
public string FullNames { get; set; }
public Countries IndividualsCountry { get; set; }
public Countries BusinessCountry { get; set; }
}
public class Countries
{
public Countries()
{
this.STRBusinessCountry = new HashSet<UserForms>();
this.STRIndividualsCountry = new HashSet<UserForms>();
}
public int Id { get; set; }
public string NameOfCountry { get; set; }
[InverseProperty("IndividualsCountry")]
public virtual ICollection<UserForm> STRIndividualsCountry { get; set; }
[InverseProperty("BusinessCountry")]
public virtual ICollection<UserForm> STRBusinessCountry { get; set; }
}
El comentario dejado por @ T.Glatzer es correcto. Debe exponer las propiedades de clave externa en sus entidades dependientes:
public class UserForms
{
public int Id { get; set; }
public string FullNames { get; set; }
public int IndividualsCountryId { get; set; }
[ForeignKey("IndividualsCountryId")]
public virtual Countries IndividualsCountry { get; set; }
public int BusinessCountryId { get; set; }
[ForeignKey("BusinessCountryId")]
public virtual Countries BusinessCountry { get; set; }
}
Aquí utilicé int
, pero si alguna de estas propiedades de navegación son opcionales, ¿simplemente debería sustituir int?
o System.Nullable<int>
lugar (que creará una columna int NULL
en la base de datos en lugar de un int NOT NULL
).
Aunque EF no requiere que exponga las propiedades de navegación, generalmente es una buena práctica. Créeme. Le ayudará a evitar excepciones inesperadas más adelante. De hecho, algunos mensajes de excepción de EF en realidad recomiendan exponer las propiedades de clave externa en las clases de entidad para ayudar a EF a descubrir mejor cómo mapear las relaciones. Aquí hay un ejemplo de una de esas excepciones. Observe la sección "Información adicional":
{"La declaración INSERT entró en conflicto con la restricción FOREIGN KEY" FK_dbo.DependentTable_dbo.PrincipalTable_Id ". El conflicto ocurrió en la base de datos" DatabaseName ", tabla" dbo.PrincipalTable ", columna 'Id'. La declaración ha finalizado."}
Información adicional: Se produjo un error al guardar entidades que no exponen propiedades de clave externa para sus relaciones. La propiedad EntityEntries devolverá un valor nulo porque una sola entidad no puede identificarse como el origen de la excepción. El manejo de las excepciones al guardar se puede hacer más fácil al exponer las propiedades de clave externa en sus tipos de entidad. Vea la InnerException para más detalles.
@danludwig gracias por explicarme @ T.Glatzer responde que esto me ha funcionado! gracias. Mi código final que ahora está funcionando es
public class UserForms
{
public int Id { get; set; }
public string FullNames { get; set; }
[ForeignKey("IndividualsCountry")]
public int? IndividualsCountryId { get; set; }
[ForeignKey("BusinessCountry")]
public int? BusinessCountryId { get; set; }
public virtual Countries IndividualsCountry { get; set; }
public virtual Countries BusinessCountry { get; set; }
}
public class Countries
{
public Countries()
{
this.STRBusinessCountry = new HashSet<UserForms>();
this.STRIndividualsCountry = new HashSet<UserForms>();
}
public int Id { get; set; }
public string NameOfCountry { get; set; }
[InverseProperty("IndividualsCountry")]
public virtual ICollection<UserForms> STRIndividualsCountry { get; set; }
[InverseProperty("BusinessCountry")]
public virtual ICollection<UserForms> STRBusinessCountry { get; set; }
}