He estado buscando recursos sobre cómo declarar relaciones de clave externa y otras restricciones usando el código primero EF 4.1 sin mucha suerte. Básicamente, estoy construyendo el modelo de datos en código y usando MVC3 para consultar ese modelo. Todo funciona a través de MVC, lo cual es genial (¡felicitaciones a Microsoft!) Pero ahora no quiero que NO funcione porque necesito tener restricciones de modelo de datos.
Por ejemplo, tengo un objeto Order que tiene un montón de propiedades que son objetos externos (tablas). Ahora mismo puedo crear un Pedido sin problema, pero sin poder agregar la clave externa u objetos externos. MVC3 configura esto sin problema.
Me doy cuenta de que podría agregar los objetos yo mismo en la clase de controlador antes de guardar, pero me gustaría que la llamada a DbContext.SaveChanges () fallara si no se cumplen las relaciones de restricción.
NUEVA INFORMACIÓN
Entonces, específicamente, me gustaría que ocurriera una excepción cuando intento guardar un objeto Pedido sin especificar un objeto de cliente. Este no parece ser el comportamiento si solo compongo los objetos como se describe en la mayoría de la documentación de Code First EF.
Último código:
public class Order
{
public int Id { get; set; }
[ForeignKey( "Parent" )]
public Patient Patient { get; set; }
[ForeignKey("CertificationPeriod")]
public CertificationPeriod CertificationPeriod { get; set; }
[ForeignKey("Agency")]
public Agency Agency { get; set; }
[ForeignKey("Diagnosis")]
public Diagnosis PrimaryDiagnosis { get; set; }
[ForeignKey("OrderApprovalStatus")]
public OrderApprovalStatus ApprovalStatus { get; set; }
[ForeignKey("User")]
public User User { get; set; }
[ForeignKey("User")]
public User Submitter { get; set; }
public DateTime ApprovalDate { get; set; }
public DateTime SubmittedDate { get; set; }
public Boolean IsDeprecated { get; set; }
}
Este es el error que obtengo ahora al acceder a la vista generada por VS para el paciente:
MENSAJE DE ERROR
El ForeignKeyAttribute en la propiedad 'Paciente' en el tipo 'PhysicianPortal.Models.Order' no es válido. El nombre de clave externa 'Padre' no se encontró en el tipo dependiente 'PhysicianPortal.Models.Order'. El valor de Nombre debe ser una lista separada por comas de nombres de propiedad de clave externa.
Saludos,
Guido
fuente
Puede definir una clave externa mediante:
Ahora ParentId es una propiedad de clave externa y define la relación requerida entre el niño y el padre existente. Salvar al niño sin el padre existente arrojará una excepción.
Si el nombre de su propiedad FK no consta del nombre de la propiedad de navegación y el nombre PK principal, debe usar la anotación de datos ForeignKeyAttribute o una API fluida para mapear la relación
Anotación de datos:
API fluida:
Se pueden aplicar otros tipos de restricciones mediante anotaciones de datos y validación de modelos .
Editar:
Obtendrá una excepción si no la establece
ParentId
. Es una propiedad requerida (no anulable). Si simplemente no lo configura, lo más probable es que intente enviar el valor predeterminado a la base de datos. El valor predeterminado es 0, por lo que si no tiene un cliente con Id = 0, obtendrá una excepción.fuente