如何使用entitystate.modified更新外键?

时间:2014-05-06 09:12:47

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

我是MVC3的新手我试图在编辑后执行更新功能内容两个外键(BRANCH_ID,ITEM_MASTER_ID)。 当branch_id或Item_master_id没有被更改时,我面临的问题很容易被更新,但是如果foreigns键改变它会给我一个错误:

  

存储更新,插入或删除语句会影响意外的行数(0)。自实体加载后,实体可能已被修改或删除。刷新ObjectStateManager条目。

这是我的模特

public partial class MATERIAL
{
    public int ID { get; set; }
    public int ITEM_MASTER_ID { get; set; }
    public int BRANCH_MASTER_ID { get; set; }
    public string NAME { get; set; }
    public string ADDRESS_DETAILS { get; set; }

    public virtual BRANCH_MASTER BRANCH_MASTER { get; set; }
    public virtual ITEM_MASTER ITEM_MASTER { get; set; }
}

我的编辑功能代码

[HttpPost]
public ActionResult Edit(MATERIAL material)
{
    if (ModelState.IsValid)
    {
        db.Entry(material).State = EntityState.Modified;
        db.SaveChanges();
        int tempid = material.ID;
        return RedirectToAction("listcontinue", new { id = tempid });

    }
    return View(material);
}

即使我的foreigns键被更改,也帮我执行更新。

这是我改进的编辑代码

public ActionResult Edit(MATERIAL material)
    {
       var temp = Convert.ToString(material.ITEM_NAME);

        using (var context = new material_managementEntities())
        {
            var temp1 = (from cs in context.ITEM_MASTER
                         where cs.ITEM_NAME == temp
                         select cs.ID).FirstOrDefault();
            material.ITEM_MASTER_ID = temp1;
        }

        var temp2 = Convert.ToString(material.ITEMGROUP);

        using (var context = new material_managementEntities())
        {
            var temp3 = (from cs in context.ITEM_GROUP_MASTER
                         where cs.ITEM_GROUP_NAME == temp2
                         select cs.ID).FirstOrDefault();
            material.ITEM_MASTER_ITEM_GROUP_MASTER_ID = temp3;
        }

        if (ModelState.IsValid)
        {
            db.MATERIALs.Attach(material);
            db.Entry(material).State = EntityState.Modified;
            db.SaveChanges();
            int tempid = material.ID;
            return RedirectToAction("listcontinue", new { id = tempid });

        }         
       return View(material);
    }

2 个答案:

答案 0 :(得分:2)

我想你忘了附上这个对象了:

db.Materials.Attach(material);
db.Entry(material).State = EntityState.Modified;
db.SaveChanges();

答案 1 :(得分:0)

我认为在上下文EF不知道外键的情况下,我必须在更新外键之前先使用一个包含:

db.Entry(team).State = EntityState.Modified;
db.SaveChanges();

var updatedTeam = db.Teams.Include(x=> x.GameType).Where(x=> x.ID == team.ID).Single();
updatedTeam.GameType = db.GameTypes.Find(GameTypeId);
db.SaveChanges();