当需要用户将两个实体链接在一起并且感觉不对时,我发现自己重复以下模式。
我有两个实体,网站和用户说,用户msut有一个网站,一个网站可以有很多用户。在添加用户表单上,可用站点显示为DropDown列表。
示例代码:
public class Site()
{
public int Id { get; set; }
public string Name { get; set; }
public virtual List<User> Users { get; set; }
}
public class User()
{
public int Id { get; set; }
public string Name { get; set; }
public int SiteId { get; set; }
public Site Site { get; set; }
}
public class UserViewModel()
{
public User User { get; set; }
public List<Site> AvailableSites { get; set; }
}
添加用户视图
@model SomeNameSpace.UserViewModel
@using (Html.BeginForm())
{
<div>
<div>@Html.LabelFor(m=>m.User.Site)</div>
<div>@Html.DropDownListFor(m=>m.User.Site.Id,
new SelectList(Model.AvailiableSites,"Id","Name"))
</div>
</div>
<--- the rest of the view --- >
控制器
public ActionResult Add()
{
UserViewModel u = new UserViewModel();
u.AvailableSites = context.Sites.ToList();
return View(u);
}
[HttpPost]
public ActionResult Add(UserViewModel model)
{
//THIS FEELS WRONG
Site s = context.Sites.Where(s=>s.Id == model.User.Site,Id).FirstOrDefault();
model.User.Site = s;
context.Users.Add(model.User);
context.SaveChanges();
}
在控制器中查找站点似乎很奇怪,我希望下拉列表将两个实体链接在一起 - 它正确显示站点名称 - 但它只设置UserViewModel.User.Site.Id值。
我错过了什么,或者这是首选/正确的方式?
答案 0 :(得分:0)
您无需抓取整个实体即可将其链接起来。只要FK已经正确设置,你需要做的就是确保已经设置了FK的ID属性(看起来你已经有了,考虑到你正在使用model.User.SiteId
抓住它实体)。
EF不需要知道完整实体就可以链接它们。它只需要知道它的ID。此外,有时分配完整实体可能会很糟糕。根据您的操作方式,您可以创建重复项。