Je souhaite mapper une relation 1-à-1 optionnelle dans une base de données existante avec EF Code First.Code EF Première relation 1 à 1
schéma simple:
User
Username
ContactID
Contact
ID
Name
Il est évident que ContactID joint à Contact.ID. Le champ ContactID est nullable donc la relation est facultative - 0 ou 1, jamais beaucoup.
Alors, comment puis-je spécifier cette relation dans EF Code First, avec ce schéma existant?
Voici ce que j'ai essayé jusqu'à présent:
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);
je reçois l'exception suivante:
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 *.
Cela m'a aidé à résoudre ce qui suit en essayant de configurer un 0: 1 à 0: 1 - L'extrémité principale de cette association doit être explicitement configurée en utilisant soit l'API fluide de relation, soit les annotations de données. –
Je vous recommande d'inclure la propriété de clé étrangère conformément à la convention (https://msdn.microsoft.com/en-us/data/jj679962). Si, chaque fois que vous créez des relations entre entités, faites-le via cette propriété de clé plutôt que la propriété d'entité. J'ai trouvé de cette façon que vous avez moins de chances d'obtenir certaines exceptions comme des clés dupliquées dans le gestionnaire d'état des objets et des exceptions plus significatives lorsque les mises à jour ne fonctionnent pas correctement. – MIP1983
Comment puis-je également utiliser un champ 'ContactId' dans' User'? Si j'utilise le code ci-dessus et que je définis un champ 'ContactId' dans User, cela me donne une erreur en disant que c'est une propriété en double. Comment puis-je dire au cadre d'entité que la colonne définie avec 'MapKey' et le' ContactId' défini dans User sont les mêmes. –