2016-09-22 8 views
2

Я надеюсь, что это не дубликат, как я искал, но я больше искал рассуждения об этом.Entity Framework Заполнение дочерних объектов с использованием внешнего ключа

Я создал объект пользователя.

public class User 
{ 
    public User() 
    { 

    } 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int UserID { get; set; } 
    public Guid UserGuid { get; set; } 
    public string Email { get; set; } 
    public string Name { get; set; } 
    public int CompanyID { get; set; } 
    public int StatusID { get; set; } 
    [ForeignKey("StatusID")] 
    public Status Status { get; set; } 
    public int RoleID { get; set; } 
    [ForeignKey("RoleID")] 
    public UserRole UserRole { get; set; } 
} 

Младенец объектов

public class UserRole 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int RoleId { get; set; } 
    public string Role { get; set; } 
} 

public class Status 
{ 
    [Key] 
    public int StatusId { get; set; } 
    public string Description { get; set; } 
} 

Когда я называю

var testuser = dbContext.User.Where(u => u.CompanyID == 1).FirstOrDefault(); 

Я получаю users.Status как нуль, но users.StatusID = 1.

однако, если я позвоню

var status = dbContext.Status.ToList(); 
var role = dbContext.UserRole.ToList(); 
var testuser = dbContext.User.Where(u => u.CompanyID == 1).FirstOrDefault(); 

затем вызвать testuser.Status, я могу видеть правильный объект, связанный с StatusId из 1.

Может кто-нибудь объяснить, почему это решило бы проблему, но и как я могу заставить его работать без необходимости вызвать заранее следующее ,

var status = dbContext.Status.ToList(); 

Благодаря

+1

См. [Загрузка связанных объектов] (https://msdn.microsoft.com/en-us/data/jj574232.aspx). В основном здесь вам нужна активная загрузка, например. 'var testuser = dbContext.User.Include (u => u.Status) ....' –

ответ

1

Просто используйте свою собственность следующим образом. Ключевое слово virtual помещает его свойство в ленивую загрузку, а затем вы можете получить доступ ко всему объекту.

public virtual Status Status { get; set; } 

И BTW, я отредактировал ваш класс. Есть ненужные вещи, потому что вы можете получить доступ к StatusID по свойству Status (например, int statID = Status.StatusID;), а также к UserRole.

public class User 
{ 
    public User() 
    { 

    } 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int UserID { get; set; } 
    public Guid UserGuid { get; set; } 
    public string Email { get; set; } 
    public string Name { get; set; } 
    public int CompanyID { get; set; } 
    public virtual Status Status { get; set; } 
    public virtual UserRole UserRole { get; set; } 
    } 
} 
+0

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

+0

Здесь лежит ответ на ваш вопрос. Я надеюсь, что это помогает! http://stackoverflow.com/a/31366407/5592255 – swdev95

2

Вы можете попробовать, как показано ниже.

Примечание: Использование Eager loading с Include()

жадная загрузка представляет собой процесс, в котором запрос для одного типа объекта также загружает связанных с ней структур, как часть запроса

using System.Data.Entity; 

var testuser = dbContext.User.Where(u => u.CompanyID == 1) 
           .Include(p => p.Status)   
           .FirstOrDefault(); 
+1

Я пошел за ленивой загрузкой, хотя оба ответа верны, спасибо за помощь. – Coesy

+0

уверен, что проблем нет :) – Sampath

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