当我在实体框架中使用外键时,当我执行POST时,外键对象为null。我正在使用MVC3和EF 4.1。我有两个表,产品和产品详细信息。我在Razor视图中使用HTML帮助程序公开它们。发生GET时,会显示产品详细信息。但是,当我执行表单提交并发布到服务器时,“产品详细信息”集合为空。我失去了所有的改变。
任何想法我做错了什么?
感谢您的帮助!
守则(我将其缩短,因为它相当冗长):
数据库:
Table Product
{
int Id
varchar Name
}
Table ProductDetails
{
int id,
int ProductId, <- foreign key SQL 2008 to Product Table
varchar Details
}
View:
@model WebSite.Models.Product
@{
ViewBag.Title = "MyLifeSaverStoreInfo";
}
@Html.TextBoxFor(m => m.Product.Name)
@Html.TextBoxFor(m => m.Product.ProductDetails.FirstOrDefault().Description)
Controller:
public ActionResult EditProduct(int productId)
{
var Product = _productRepository.GetProduct(productId);
return View(product);
}
[HttpPost]
public ActionResult EditProduct(Product model)
{
string name = model.Name; <- this update comes through
string description = model.ProductDetails.FirstorDefault().Description;
}
由于
答案 0 :(得分:0)
知道了!
我没有在POST EditProduct方法上创建“Product”实体,而是使用Form Collection,然后根据该表单集合设置每个产品详细信息,然后保存。我不明白为什么它不起作用的第一种方式。我手动更新外部引用。也许我错过了什么?
[HttpPost]
public ActionResult EditProduct(int id, FormCollection formCollection)
{
var model = new MyLSstoreInfoViewModel{
StoreCurrent = _profileRepository.GetProduct(Id)
};
var productDetails = model.Product.ProductDetails.Where(p => p.productId == id).Single();
productDetaisl.Details = formCollection["details"];
if (TryUpdateModel(model.StoreCurrent))
{
_profileRepository.Save();
}
}
答案 1 :(得分:0)
这有点晚了,但对未来的某些人可能有用:
如果您将引用子项的主键作为视图中的隐藏输入传递,它将正确解析操作中的子模型。