Asp.net mvc 一个字段拒绝使用EF更新
我有一个不寻常的问题。数据库中的一个字段(FK_ItemType)不会自动更新。我进入vs调试,检查是否分配了int ItemType,是否在数据库中找到了一条记录,是否将该记录分配给item.FK_ItemType,以及该记录是否一直附加到Asp.net mvc 一个字段拒绝使用EF更新,asp.net-mvc,entity-framework,asp.net-mvc-4,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,我有一个不寻常的问题。数据库中的一个字段(FK_ItemType)不会自动更新。我进入vs调试,检查是否分配了int ItemType,是否在数据库中找到了一条记录,是否将该记录分配给item.FK_ItemType,以及该记录是否一直附加到db.SaveChanges()(我使用断点检查db.Entry(item)处item.FK_ItemType的值).State=EntityState.Modified; 更确切地说,在我注释掉我的重定向并从数据库中提取记录并检查值是什么之后,立即返回该值
db.SaveChanges()
(我使用断点检查db.Entry(item)处item.FK_ItemType的值).State=EntityState.Modified;
更确切地说,在我注释掉我的重定向并从数据库中提取记录并检查值是什么之后,立即返回该值而不是重定向。它返回正确的值
然而,当我查看数据库或进入我的列表页面时,新更新的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);
}
模型
尽管名称为
FK_ItemType
但此属性不是FK(外键)属性。它是一个导航属性,当您将状态设置为Modified
时,导航属性表示的关系不会更新(这同样适用于FK_公司
和FK_服务
)
您可以引入“真实”外键属性
[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"
…然后直接使用FKRealFK_ItemType
更改关系
或者,您必须首先从数据库(包括相关实体)加载原始的项,才能通过设置导航属性来更改关系。更新的代码如下所示:
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();
如果modelbinder正在绑定模型,您将希望将此问题上的标记更改为与EF相关,而不是与mvc相关-related@ChadRuppert谢谢,可以。谢谢,我没有意识到EntityState。Modified没有更新外键关系!
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();