2011-05-16 4 views
26

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 *. 

Répondre

42

Une solution serait;

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")); 

Vous définissez uniquement vos objets de navigation dans votre Poços et au lieu que vous utilisez API couramment pour mapper votre clé de la bonne colonne.

+0

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. –

+1

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

+9

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. –

Questions connexes