C# 从viewmodel获取相关数据?

C# 从viewmodel获取相关数据?,c#,asp.net,asp.net-mvc,entity-framework,C#,Asp.net,Asp.net Mvc,Entity Framework,使用实体框架获取某些相关数据的值时遇到问题。基本前提是“财产”属于单个“社区”,“社区”属于单个“区域” 我的物业有以下型号: public class Property { public int ID { get; set; } public string Name { get; set; } public int CommunityID { get; set; } public int PropertyTypeID { get; set; }

使用实体框架获取某些相关数据的值时遇到问题。基本前提是“财产”属于单个“社区”,“社区”属于单个“区域”

我的物业有以下型号:

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; }
}
但是,尝试使用以下控制器方法将其推入视图时会出现问题:

Property property = await db.Property.FindAsync(id);
var viewModel = new PropertyDetailViewModel
{
    Name = property.Name,
    Community = property.Community,
    Region = property.Community.Region
};
return View(viewModel);
在我的视图中,我正在使用创建区域名称的占位符

@DisplayFor(model=>model.Region.Name)


但是这显示为空,即使数据库中肯定有有效的条目?

您可以使用include,这样您的区域就不会为空

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

更详细:

尝试在视图模型中展平区域对象,以仅使用所需的字段:

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()
结合使用以提高性能

在DB中包含条目是一件事,您是否在视图模型中填充该属性?您是否调试它以查看是否正在设置值?我一直在阅读的教程似乎使用虚拟属性。在线快速搜索后,调用数据库时似乎效率更高,因为它使用延迟加载。啊,是的,这很有意义。让我试一试,我会让你知道我进展如何。感谢you@Gavin5511-确保您了解急切加载的缺点,然后再接受它作为您的最佳选择。通过从区域导航属性中删除virtual关键字,您将在每次加载系统中任何位置的属性实体时加载整个区域对象。假设区域是一个小实体或在加载属性时始终使用,这可能不是问题。但是想象一下,这个地区是一个巨大的实体,拥有大量的财产和其他相关数据。您可能不希望每次加载属性时都加载整个区域对象。YMMV。谢谢@chambo,我理解。事实上,我现在已经解决了这个问题,情况正好相反。如果您查看上面我的模型,viewmodel使用的是虚拟财产,但我的数据模型不是。我没有将两者都改为使用虚拟,而且它工作得很好。我不知道为什么这可能已经解决了这个问题?也许是因为不匹配而把它弄糊涂了?
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);
@Html.DisplayFor(model => model.RegionName)