EF在编辑时不保存虚拟属性

时间:2014-05-24 09:04:47

标签: c# asp.net-mvc entity-framework

我有一个模型Team,如下所示:

public class Team
{
    [Key]
    public int TeamId { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }
    public virtual Group Group { get; set; }
}

我有Edit方法:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Team team)
{
    using (var db = new DbConnection())
    {
        if (ModelState.IsValid)
        {
            db.Entry(team).State = EntityState.Modified;

            db.Groups.Attach(team.Group);

            db.SaveChanges();
        }

        return PartialView(team);
    }
}

但是,它没有将更改保存到Group列。同时Create方法确实有效,但我发现它们之间没有区别:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Team team)
{
    using (var db = new DbConnection())
    {                
        if (ModelState.IsValid)
        {
            db.Groups.Attach(team.Group);

            db.Teams.Add(team);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return PartialView(team);
    }
}

Group的值在两种方法中都相同。我将这些值带到这样的表单中(同样,两者都是一样的):

ViewBag.Groups = db.Groups.ToList().Select(g => new SelectListItem()
{
    Text = g.Code,
    Value = g.GroupId.ToString(),
    Selected = false
}).ToList(); 

并像这样使用它们:

@Html.DropDownListFor(model => model.Group.GroupId, (List<SelectListItem>)ViewBag.Groups)

有人可以解释两种方法之间的区别(就一个保存Group而不是其他方式 - 不是)?

P.S。使用最新的MVC和EF。

1 个答案:

答案 0 :(得分:0)

显然必须(?)(至少我找不到更好的东西)添加与Group类型相匹配的字段,以便能够轻松保存。不需要以这种方式附加任何东西。现在我的模型看起来像:

public class Team
{
    [Key]
    public int TeamId { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }
    public int? GroupId { get; set; }
    public virtual Group Group { get; set; }
}

我的SaveCreate方法得到了这一行:

db.Groups.Attach(team.Group);

移除。