Внешний ключ с Entity Framework

У меня есть два класса модели User и Reclamation, у класса Reclamation есть внешний ключ для объекта User, вот два моих класса:

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, если я закодирую это вручную в установленном свойстве атрибута idUser в классе Reclamation или мне что-то не хватает?


person user3578325    schedule 17.03.2015    source источник
comment
Вы используете Entity Framework?   -  person Dustin Kingen    schedule 18.03.2015
comment
да, я использую фреймворк   -  person user3578325    schedule 18.03.2015
comment
Можете ли вы просто получить объект пользователя из базы данных, а затем прикрепить к нему претензию? Вместо того, чтобы вручную добавлять идентификатор пользователя в новую претензию? Вы обнаружите, что лучше работать с графом сущностей в EF, чем пытаться делать что-то вручную.   -  person lintmouse    schedule 18.03.2015
comment
Я думаю, что смогу это сделать, но я спрашиваю, есть ли автоматический способ сделать это вместо добавления вручную.   -  person user3578325    schedule 18.03.2015


Ответы (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;}
        }

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

context.Users.Include(x => x.Reclamations).ToList();
person vortex    schedule 18.03.2015
comment
он работал нормально, спасибо, но не могли бы вы объяснить мне, почему он не работал без виртуального свойства? какова здесь роль виртуального? - person user3578325; 18.03.2015
comment
Это правило / соглашение / в Entity Framework, которое разрешает отложенную загрузку. Ответ здесь stackoverflow.com/questions/7738722 / есть подробное объяснение. - person vortex; 18.03.2015

вам следует попробовать этот код:

UserData.Include("Reclamation").ToList();
person user3567028    schedule 18.03.2015