实体框架通过在下拉框中查找来链接相关实体

时间:2013-12-02 18:52:58

标签: entity-framework

当需要用户将两个实体链接在一起并且感觉不对时,我发现自己重复以下模式。

我有两个实体,网站和用户说,用户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值。

我错过了什么,或者这是首选/正确的方式?

1 个答案:

答案 0 :(得分:0)

您无需抓取整个实体即可将其链接起来。只要FK已经正确设置,你需要做的就是确保已经设置了FK的ID属性(看起来你已经有了,考虑到你正在使用model.User.SiteId抓住它实体)。

EF不需要知道完整实体就可以链接它们。它只需要知道它的ID。此外,有时分配完整实体可能会很糟糕。根据您的操作方式,您可以创建重复项。