一个字段拒绝使用EF更新

时间:2013-01-16 17:29:38

标签: asp.net-mvc entity-framework asp.net-mvc-4

我有一个不寻常的问题。数据库中的一个字段(FK_ItemType)不会自行更新。我进入了vs debug,并检查了int ItemType是否被分配,它在数据库中找到了一条记录,它将该记录分配给item.FK_ItemType,并且该记录一直保持附加到db.SaveChanges()(我使用断点检查db.Entry(item).State = EntityState.Modified;

处的item.FK_ItemType的值

更确切地说,在我注释掉我的重定向并从数据库中提取记录并检查值是什么之后,立即返回,而不是重定向。它返回正确的值。

但是,当我查看数据库或转到我的列表页面时,新更新的ItemType不存在(数据库中仍为NULL)。更令人费解的是,添加记录时一切都运行得很好。

以下是我的控制器和模型的相关部分

    [HttpPost]
    public ActionResult Edit(Item item, int Company = 0, int Service = 0, int ItemType = 0)
    {
        if (Request.Form["doDelete"] == "true")
            return Delete(item);
        //Get, assign foreign keys
        Company c = db.Companies.Find(Company);
        Service s = db.Services.Find(Service);
        ItemType i = db.ItemTypes.Find(ItemType);
        if (c != null)
            item.FK_Company = c;
        if (s != null)
            item.FK_Service = s;
        if (i != null)
            item.FK_ItemType = i;
        //Force revalidate
        ModelState.Clear();
        //TryUpdateModel(item);
        TryValidateModel(item);

        if (ModelState.IsValid)
        {
            if (item.ItemID == 0) //add
                db.Items.Add(item);
            else
            {
                db.Entry(item).State = EntityState.Modified;
            }
            db.SaveChanges();
            Item i2 = db.Items.Find(item.ItemID);
            Response.Write(i2.FK_ItemType.Name);
            return null;
            // Return to the listing page, and show the user the filters they were looking at before editing.
            return Redirect("~/" + Request.RequestContext.RouteData.Values["Controller"].ToString() + "/Index/" + Request.Form["ref"]);
        }
        // There was a validation error
        if (item.ItemID != 0)
            return Update(item);
        else
            return Add(item);
    }

模型

public class Item
{
    public int ItemID { get; set; }

    ...

    [Required]
    [Display(Name="Company")]
    public virtual Company FK_Company { get; set; }
    [Required]
    [Display(Name="Service")]
    public virtual Service FK_Service { get; set; }
    [Display(Name="Item Type")]
    public virtual ItemType FK_ItemType { get; set; }
}

1 个答案:

答案 0 :(得分:0)

尽管名称为FK_ItemType,但此属性不是FK(外键)属性。它是一个导航属性,当您将状态设置为Modified时,不会更新由导航属性表示的关系。 (这同样适用于FK_CompanyFK_Service。)

你可以介绍“真正的”外键属性......

[ForeignKey("FK_ItemType")]
public int RealFK_ItemType { get; set; }
public virtual ItemType FK_ItemType { get; set; }

// please give those properties better names..., like "ItemTypeID" and "ItemType"

...然后直接使用FK RealFK_ItemType来改变关系。

或者您必须首先从数据库加载原始Item(包括相关实体),以通过设置导航属性来更改关系。 UPDATE的代码是这样的:

var itemIdDb = db.Items
    .Include(i => i.Company)
    .Include(i => i.Service)
    .Include(i => i.ItemType)
    .Single(i => i.ItemID == item.ItemID);

Company c = db.Companies.Find(Company);
Service s = db.Services.Find(Service);
ItemType i = db.ItemTypes.Find(ItemType);
if (c != null)
    itemInDb.FK_Company = c;
if (s != null)
    itemInDb.FK_Service = s;
if (i != null)
    itemInDb.FK_ItemType = i;

db.Entry(itemInDb).CurrentValues.SetValues(item);
db.SaveChanges();