我尝试使用EF6和MVC更新虚拟财产。 我的代码是这样的:
public async Task<ActionResult> Edit([Bind(Include = "Id,Title,Content,Image")] Recommendation recommendation, HttpPostedFileBase file)
{
if (ModelState.IsValid)
{
if (file != null)
{
//we have an image - saving it to db
var image = Server.SaveFile(file, Request);
DB.Files.Add(image);
await DB.SaveChangesAsync();
//assign the new image to the recommendation
recommendation.Image = image;
}
recommendation.User = await GetLoggedInUserAsync();
DB.Entry(recommendation).State = EntityState.Modified;
await DB.SaveChangesAsync();
return RedirectToAction("Index");
}
return View(recommendation);
}
图像保存在Files
表中。然而,Image_Id
表格中的Recommendations
列不会更新为新Image_Id
。我在这里缺少什么?
类:
public class Item
{
[Key]
public int Id { get; set; }
public virtual ApplicationUser User{ get; set; }
[Required]
[DataType(DataType.Text)]
[Display(Name = "Title")]
public string Title { get; set; }
[Required]
[DataType(DataType.MultilineText)]
[Display(Name = "Content")]
public string Content { get; set; }
}
public class Recommendation : Item
{
[DisplayName("Image")]
public virtual File Image { get; set; }
}
public class File
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public string Url { get; set; }
}
答案 0 :(得分:4)
问题是,您正在使用独立关联(没有外键ID),例如。
public int ImageId { get; set; }
您还可以使用断开连接的对象。所以你需要手动维护关系。在添加新关系之前,您还必须先删除旧关系。
如果您使用的是断开连接的对象,则必须手动进行管理 同步。 - MSDN
尝试添加此代码以手动管理关系。
var manager = ((IObjectContextAdapter)DB).ObjectContext.ObjectStateManager;
// Removes previous relationship.
if (recommendation.Image != null)
{
// If there is another image, but you don't remove it, the update will fail.
manager.ChangeRelationshipState(recommendation, recommendation.Image,
r => r.Image, EntityState.Deleted);
}
// Adds new relationship.
manager.ChangeRelationshipState(recommendation, image,
r => r.Image, EntityState.Added);
尝试重新考虑类设计以获得外键关联。
有关详细信息,请参阅this post。