更新EF4.1 MVC3中的外键表。 POST上的对象为空

时间:2011-06-26 21:19:28

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

当我在实体框架中使用外键时,当我执行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;
}

由于

2 个答案:

答案 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)

这有点晚了,但对未来的某些人可能有用:

如果您将引用子项的主键作为视图中的隐藏输入传递,它将正确解析操作中的子模型。