2013-06-14 7 views
1

J'ai un problème avec Entity Framework.Entité auto-référente Entity Framework

public class User : Receiver 
{ 
    public User() 
    { 
     if (Groups == null) 
      Groups = new List<Group>(); 
     if (Buddies == null) 
      Buddies = new List<User>(); 
    } 

    [Required] 
    public string PhoneNumber { get; set; } 
    [ForeignKey("Guid"), JsonIgnore] 
    public IList<User> Buddies { get; set; } 
    [ForeignKey("Guid"), JsonIgnore] 
    public IList<Group> Groups { get; set; } 
} 

public class Receiver 
{ 
    public Receiver() 
    { 
     Guid = Guid.NewGuid(); 
     Created = DateTime.Now; 
    } 

    [Key] 
    public Guid Guid { get; set; } 
    [Required] 
    public DateTime Created { get; set; } 
} 

Quand je tente d'ajouter un utilisateur ...

User user = new User 
      { 
       Guid = new Guid("8cd094c9-e4df-494e-b991-5cf5cc03d6e3"), 
       PhoneNumber = "+4991276460" 
      }; 

     cmc.Receivers.Add(user); 

... il se termine par erreur follogwing.

L'objet du type "System.Collections.Generic.List`1 [Project.Models.User]" ne peut pas être converti en "Project.Models.User".

Quand je commente à la suite de deux lignes:

[ForeignKey("Guid"), JsonIgnore] 
    public IList<User> Buddies { get; set; } 

... le programm fonctionne très bien.

J'espère que quelqu'un peut m'aider à résoudre ce problème.

Sinon, elle se heurte à une erreur sur cette ligne: cmc.Receivers.Add(user);

Répondre

0

Dans votre cartographie ...

[ForeignKey("Guid"), JsonIgnore] 
public IList<User> Buddies { get; set; } 

... vous spécifiez que User.Buddies fait partie d'un-à-plusieurs et que User.Guid (= Receiver.Guid) est la clé étrangère dans cette relation. Mais User.Guid est également la clé primaire, d'où il doit être unique. Par conséquent, un User ne peut pas avoir une liste de Buddies mais seulement une référence unique.

Le mappage n'a aucun sens mais l'exception n'est pas très utile et difficile à comprendre. (En quelque sorte, EF semble reconnaître en interne que le Buddies ne peut pas être une liste avec ce mappage et veut convertir la liste en une seule référence.Il devrait détecter à mon avis que le mappage est invalide en premier lieu.)

Pour un mappage un-à-plusieurs correct vous avez besoin d'une clé étrangère qui est différente de la clé primaire. Vous pouvez y parvenir en enlevant l'annotation [ForeignKey] tout à fait ...

[JsonIgnore] 
public IList<User> Buddies { get; set; } 

... dans ce cas, EF crée une valeur par défaut de clé étrangère dans la table Receivers (ce sera une colonne avec un trait de soulignement en son nom , mais vous pouvez renommer que avec l'API Fluent si vous ne souhaitez pas le nom par défaut) ou en ajoutant votre propriété clé étrangère à la classe User:

public Guid? BuddyGuid { get; set; } 

[ForeignKey("BuddyGuid"), JsonIgnore] 
public IList<User> Buddies { get; set; } 
+0

Merci! Vous avez résolu mon problème! – user2485703

Questions connexes