J'ai cherché des ressources sur la façon de déclarer les relations de clé étrangère et d'autres contraintes en utilisant d'abord le code EF 4.1 sans beaucoup de chance. Fondamentalement, je construis le modèle de données dans le code et j'utilise MVC3 pour interroger ce modèle. Tout fonctionne via MVC, ce qui est génial (bravo à Microsoft!) Mais maintenant je ne veux PAS que cela fonctionne car j'ai besoin de contraintes de modèle de données.
Par exemple, j'ai un objet Order qui a une tonne de propriétés qui sont des objets externes (tables). Pour le moment, je peux créer une commande sans problème, mais sans pouvoir ajouter la clé étrangère ou des objets externes. MVC3 met cela en place sans problème.
Je me rends compte que je pourrais simplement ajouter les objets moi-même dans la classe de contrôleur avant d'enregistrer, mais je voudrais que l'appel à DbContext.SaveChanges () échoue si les relations de contrainte n'ont pas été respectées.
NOUVELLE INFORMATION
Donc, plus précisément, j'aimerais qu'une exception se produise lorsque je tente de sauvegarder un objet Order sans spécifier d'objet client. Cela ne semble pas être le comportement si je compose simplement les objets comme décrit dans la plupart de la documentation Code First EF.
Dernier code:
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; }
}
C'est l'erreur que j'obtiens maintenant lors de l'accès à la vue générée par VS pour le patient:
MESSAGE D'ERREUR
Le ForeignKeyAttribute sur la propriété 'Patient' sur le type 'PhysicianPortal.Models.Order' n'est pas valide. Le nom de clé étrangère «Parent» est introuvable sur le type dépendant «PhysicianPortal.Models.Order». La valeur Name doit être une liste de noms de propriété de clé étrangère séparés par des virgules.
Cordialement,
Guido
la source
Vous pouvez définir une clé étrangère par:
Maintenant ParentId est la propriété de clé étrangère et définit la relation requise entre l'enfant et le parent existant. Enregistrer l'enfant sans quitter le parent lèvera une exception.
Si le nom de votre propriété FK ne comprend pas le nom de la propriété de navigation et le nom PK parent, vous devez utiliser l'annotation de données ForeignKeyAttribute ou l'API fluide pour mapper la relation
Annotation des données:
API Fluent:
D'autres types de contraintes peuvent être appliqués par des annotations de données et la validation du modèle .
Éditer:
Vous obtiendrez une exception si vous ne définissez pas
ParentId
. Il s'agit d'une propriété obligatoire (non nullable). Si vous ne le définissez pas, il essaiera probablement d'envoyer la valeur par défaut à la base de données. La valeur par défaut est 0, donc si vous n'avez pas de client avec Id = 0, vous obtiendrez une exception.la source