我是一个完全的初学者,我有一个关于在EF中级联1到多个rel的小问题... 假设我有3个实体,一个国家有许多城市,每个城市都有很多酒店......
class Country
{
public int Id {get; set; }
public string CountryName {get; set; }
public virtual ICollection<City> Cityes {get; set; }
}
class City
{
public int Id {get; set; }
public string CityName {get; set; }
public virtual Country Country {get; set; }
public virtual ICollection<Hotel> Hotels {get; set; }
}
class Hotel
{
public int Id {get; set; }
public string HotelName {get; set; }
public virtual City City {get; set; }
}
这是我的简单存储库
public IQueryable<Hotel> GetAllHotels()
{
return context.HotelTable.Include("City");
}
在我的MVC客户端中,我有一个简单的投影
public class HotelVm
{
public string HotelName {get; set; }
public string CityName {get; set; }
public string CountryName {get; set; } // here is the problem
}
投影的工厂模型
public class Factory
{
public HotelVm Create(Hotel h)
{
return new HotelVm()
{
HotelName = h.HotelName ,
CityName = h.City.CityName ,
CountryName = ???
}
}
}
最后我的MVC中的Controller
public Repository repo = new Repository();
public Factory fact = new Factory ();
public ActionResult Index()
{
IQueryable<Hotel> hotel = repo.GetAllHotels();
var result = hotel.ToList().Select(h=> fact.Create(h));
return View(result);
}
现在很明显,我的创建HotelVM
未将对象引用设置为对象的实例。 ...在我的创建新HotelVm
...
不确定如何在我的投影中得到国家的名称,或者我是否应该采取不同的策略......
任何帮助都会很棒。
答案 0 :(得分:0)
修改存储库以加载City
的相关实体。
public IQueryable<Hotel> GetAllHotels()
{
return context.HotelTable.Include("City").Include("City.Country");
}
然后修改工厂以使用属于Country
的{{1}}。
City
请务必使用防御性编码做法来防止例外public class Factory
{
public HotelVm Create(Hotel h)
{
return new HotelVm()
{
HotelName = h.HotelName,
CityName = h.City.CityName,
CountryName = h.City.Country.CountryName
}
}
}
。