首页 > 解决方案 > 如何从编辑视图 ASP.NET MVC 更新两个表?

问题描述

我正在尝试更新两个表中的数据;productsinventory。表的主键productscod_prod,它是产品的条形码。这是与products表和其他的关系。对所有字段进行更新,但是在数据库管理员cod_prod中,表中的字段inventory没有更新,它只是变成null,在products表中进行了更新,reg_date字段,也就是inventory表中的字段更新。只有表cod_prod上的字段inventory没有更新,我不知道为什么。

视图模型:

public class products
{

   [Display(Name = "Name")]
   public string name { get; set; }

   [Key]
   [Display(Name = "Product Code")]
   public string cod_prod { get; set; }

   [Display(Name = "Register Date")]
   [DataType(DataType.Date)]
   [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
   public DateTime? reg_date { get; set; }
}

控制器:

[HttpGet]
public ActionResult prodEdit(int id)
{
    using (inventarioEntitiesDBA dc = new inventarioEntitiesDBA())
    {
        var u = dc.products.Where(a => a.id == id).FirstOrDefault();
        if (u != null)
        {
            var pm = new products
            {
                name = u.name,
                cod_prod = u.cod_prod,
                reg_date = u.reg_date
            };

            var b = dc.inventory.Where(x => x.cod_prod == pm.cod_prod).FirstOrDefault();

            u.cod_prod = b.cod_prod;

            return View(u);
        }

        return Content("Invalid Request");

    }
}

[HttpPost]
public ActionResult prodEdit(products prod)
{
    using (inventarioEntitiesDBA dc = new inventarioEntitiesDBA())
    {

        var u = dc.products.Where(a => a.id == prod.id).FirstOrDefault();

        var b = dc.inventory.Where(x => x.cod_prod == prod.cod_prod).FirstOrDefault();

        inventory bod = new inventory()
        {
            cod_prod = prod.cod_prod,
            reg_date = prod.reg_date
        };

        
        dc.inventory.Remove(b);
        dc.inventory.Add(bod);
        dc.products.Remove(u);
        dc.products.Add(prod);
        dc.SaveChanges();

        return RedirectToAction("prodList", "products");

    }
}

任何建议表示赞赏。

更新:

型号products

public partial class products
{

   [Display(Name = "Name")]
   public string name { get; set; }

   [Key]
   [Display(Name = "Product Code")]
   public string cod_prod { get; set; }
}

型号inventory

public partial class inventory
{
   [Key]
   [Display(Name = "Product Code")]
   public string cod_prod { get; set; }

   [Display(Name = "Register Date")]
   [DataType(DataType.Date)]
   [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
   public DateTime? reg_date { get; set; }
}

标签: c#asp.net-mvcentity-frameworkrazor

解决方案


假设您在 Products 和 Inventory 表之间存在一对一的关系,您的模型在 EF 中将如下所示:

产品型号

public class Products
{

   [Display(Name = "Name")]
   public string name { get; set; }

   [Key]
   [Display(Name = "Product Code")]
   public string cod_prod { get; set; }

   public virtual Inventory Inventory {get;set;}
}

库存模型

public class Inventory
{
   [Key, ForeignKey("Products")]
   [Display(Name = "Product Code")]
   public string cod_prod { get; set; }

   [Display(Name = "Register Date")]
   [DataType(DataType.Date)]
   [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
   public DateTime? reg_date { get; set; }

   public virtual Products Products {get;set;}
}

配置关系后,您可以简单地在 POST 方法中执行此操作来更新产品和库存:

[HttpPost]
public ActionResult prodEdit(Products prod)
{
    using (inventarioEntitiesDBA dc = new inventarioEntitiesDBA())
    {

        var product = dc.products.Where(a => a.id == prod.id).FirstOrDefault();

        var inventory = product.Inventory;

        inventory.cod_prod = prod.cod_prod;
        inventory.reg_date = prod.reg_date;
        dc.SaveChanges();

        return RedirectToAction("prodList", "products");

    }
}

您可以在此处阅读有关如何配置 EF 关系的更多信息。


推荐阅读