2017-01-09 3 views
0

У меня возникли проблемы с получением значения для некоторых связанных данных с использованием Entity Framework. Основная предпосылка является то, что «собственность» относится к одному «сообществу», и «сообщество» относится к одному «региону»Получение связанных данных из viewmodel?

У меня есть следующая модель для моей собственности:

public class Property 
{ 
    public int ID { get; set; } 

    public string Name { get; set; } 

    public int CommunityID { get; set; } 

    public int PropertyTypeID { get; set; } 

    public virtual Community Community { get; set; } 

} 

и для моей модели сообщества ..

public class Community 
{ 
    public int ID { get; set; } 

    public string Name { get; set; } 

    public Region Region { get; set; } 

    public virtual ICollection<Property> Properties { get; set; } 
} 

и для моего региона ...

public class Region 
{ 
    public int ID { get; set; } 

    public string Name { get; set; } 

    public virtual ICollection<Community> Communities { get; set; } 
} 

Я вытащил все-й это вместе в ViewModel ...

public class PropertyDetailViewModel 
{ 
    public string Name { get; set; } 

    public virtual Community Community { get; set; } 

    public virtual Region Region { get; set; } 
} 

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

Property property = await db.Property.FindAsync(id); 
var viewModel = new PropertyDetailViewModel 
{ 
    Name = property.Name, 
    Community = property.Community, 
    Region = property.Community.Region 
}; 
return View(viewModel); 

На мой взгляд, я творю заполнитель для региона имен с использованием

@ Html.DisplayFor (модель => model.Region.Name)

Но это показывается как пустое, хотя в базе данных есть достоверные записи?

+0

, имеющие записей в БД одна вещь, которую вы заселение свойство на вашей модели представления? вы отлаживали его, чтобы узнать, установлены ли значения? –

+0

Учебник, который я читал, кажется, использует виртуальные свойства. После быстрого поиска в Интернете кажется более эффективным при вызове базы данных, поскольку она использует ленивую загрузку. – Gavin5511

+0

А, да, это имеет смысл. Позвольте мне попробовать, и я дам вам знать, как я нахожусь. Спасибо – Gavin5511

ответ

0

Вы можете использовать include, чтобы ваш регион не был нулевым.

Property property = await db.Property.Include(p => p.Community.Region).FirstOrDefaultAsync(p => p.ID == id); 

Более подробно: Include() in LINQ to Entities query

0

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

public class PropertyDetailViewModel 
{ 
    public string Name { get; set; } 

    public virtual Community Community { get; set; } 

    public string RegionName { get; set; } 
} 

Затем обновите вид модели кода отображения:

Property property = await db.Property.FindAsync(id); 
var viewModel = new PropertyDetailViewModel 
{ 
    Name = property.Name, 
    Community = property.Community, 
    RegionName = property.Community.Region.Name 
}; 
return View(viewModel); 

Наконец, обновите свой вид использования сплющенного RegionName свойство в модели представления:

@Html.DisplayFor(model => model.RegionName) 

Используйте это в сочетании с .Include() в инструкции запроса для повышения производительности

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