2015-03-17 2 views
0

Я две модели пользовательских классов и мелиоративных, класс Рекультивация есть внешний ключ для объекта пользователя, вот мои два класса:внешнего ключа с Entity Framework

public class User 
{ 
    [Key, ScaffoldColumn(false), Display(Name = "ID User")] 
    public int idUser { set; get; } 

    [Required, StringLength(16), Display(Name = "Login")] 
    public string login { set; get; } 

    [Required, StringLength(16), Display(Name = "Password")] 
    public string password { set; get; } 
} 

public class Reclamation 
{ 
    [Key, ScaffoldColumn(false), Display(Name = "ID Reclamation")] 
    public int idReclamation { set; get; } 

    [ForeignKey("idUser")] 
    public User user{ set; get; } 

    [Required, Display(Name = "ID Rapporteur")] 
    public int idUser { set; get; } 

    [Required, StringLength(30), Display(Name = "Message")] 
    public string message{ set; get; } 
} 

позволяет сказать, например, что у меня есть пользователя с idUser = 1. Когда я создаю новую Reclamation с idUser = 1, она будет вставлена ​​в базу данных, но моя проблема с объектом User не содержит информации пользователя с idUser = 1, должен ли я закодировать это вручную в наборе Property атрибута idUser в классе Reclamation или я чего-то не хватает?

+0

Вы используете структуру сущностей? – Romoku

+0

Да, я использую структуру сущности – user3578325

+0

Можете ли вы просто извлечь объект пользователя из базы данных и затем приложить к нему рекультивацию? Вместо того, чтобы вручную добавить идентификатор пользователя к новой рекультивации? Вы найдете, что лучше работать с графом сущностей в EF, чем пытаться делать что-то вручную. – lintmouse

ответ

2

Вы можете добавить виртуальную собственность к классу сущностей для включения отложенной загрузки. Таким образом, вы включите EF для загрузки связанного объекта, когда он будет запрошен.

 public class User 
     { 
      [Key, ScaffoldColumn(false), Display(Name = "ID User")] 
      public int idUser { set; get; } 

      [Required, StringLength(16), Display(Name = "Login")] 
      public string login { set; get; } 

      [Required, StringLength(16), Display(Name = "Password")] 
      public string password { set; get; } 

      public virtual Reclamation Reclamation {get; set;} 

      /*if you have one to many relationship, use Collection<T> 
    and initialize it in the constructor Reclamations = new Collection<Reclamation>();*/ 
      public virtual Collection<Reclamation> Reclamations {get; set;} 
     } 

Ваш другой вариант - использовать Eager Loading, как указано выше. Что-то вроде:

context.Users.Include(x => x.Reclamations).ToList(); 
+0

он отлично работал, но вы можете объяснить мне, почему это не сработало без виртуальной собственности? Какова роль виртуального здесь? – user3578325

+0

Это правило/конвенция/в Entity Framework, которая позволяет Lazy Loading. Ответ здесь http://stackoverflow.com/questions/7738722/entity-framework-4-1-virtual-properties содержит подробное объяснение. – vortex

2

вы должны попробовать этот код:

UserData.Include("Reclamation").ToList(); 
Смежные вопросы