2013-06-14 3 views
1

У меня проблема с Entity Framework.Объект самообучения 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; } 
} 

Когда я пытаюсь добавить пользователя ...

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

     cmc.Receivers.Add(user); 

... она заканчивается в follogwing ошибки.

Объект типа "System.Collections.Generic.List`1 [Project.Models.User]" не может быть преобразован в "Project.Models.User".

Когда я закомментируйте следующие две строки:

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

... программка работает нормально.

Я надеюсь, что кто-то может помочь мне исправить эту проблему.

В противном случае он впадает в ошибку на этой линии: cmc.Receivers.Add(user);

ответ

0

В вашем отображении ...

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

... вы указываете, что User.Buddies является частью отношения один-ко-многим и что User.Guid (= Receiver.Guid) является иностранным ключом в этих отношениях. Но User.Guid также является первичным ключом, поэтому он должен быть уникальным. В результате User не может иметь список Buddies, но только одну ссылку.

Картирование не имеет смысла, но исключение не очень полезно и трудно понять. (Как-то EF, по-видимому, внутренне признает, что Buddies не может быть списком с этим сопоставлением и хочет передать список в одну ссылку. Он должен, по-моему, обнаружить, что отображение недействительно в первую очередь.)

Для правильное сопоставление «один-ко-многим» вам нужен внешний ключ, который отличается от первичного ключа. Вы можете достичь, либо удалением [ForeignKey] аннотацию вообще ...

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

... в этом случае EF создаст внешний ключ по умолчанию в таблице Receivers (это будет какой-нибудь столбец с подчеркиванием в названии , но вы можете переименовать, что с Fluent API, если вам не нравится имя по умолчанию) или добавив свой собственный внешний ключ свойство к User класса:

public Guid? BuddyGuid { get; set; } 

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

Спасибо! Вы решили мою проблему! – user2485703

Смежные вопросы