【问题标题】:how update two tables from Edit View ASP.NET MVC?如何从编辑视图 ASP.NET MVC 更新两个表?
【发布时间】:2020-10-16 01:21:42
【问题描述】:

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

视图模型:

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; }
}

【问题讨论】:

  • 请展示你的模特。
  • 我用两个表的模型更新了问题。再次感谢任何建议。
  • POST动作上下断点,看看cod_prod是否为空。

标签: c# asp.net-mvc entity-framework razor


【解决方案1】:

假设您在 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 关系here

【讨论】:

  • 感谢您的回复,我真的不知道我可以这样更新。我发布的解决方案是我能找到解决问题的唯一方法,但是使用此解决方案您可以看出它要容易得多。
【解决方案2】:

如果同样的事情发生在某人身上,这就是我写的解决它,controller 有两个 post 方法,第一个删除已更改的字段,保存数据库并发送 productsinventory 对象到第二种方法,在那里,添加模型的新数据并保存。我必须这样做,因为删除 products 表上的 PK 会导致 null 事情。

控制器:

    [HttpPost]
    public ActionResult prodEdit(products prod)
    {
        using(inventarioEntitiesDBA dc = new inventarioEntitiesDBA())
        {
            var u = dc.products.Where(a => a.id == prod.id).FirstOrDefault();

            if(u != null)
            {
                var pm = new products
                {
                    prod_name = prod.prod_name,
                    cod_prod = prod.cod_prod,
                    fecha_ingreso = prod.fecha_ingreso
                };

                var b = dc.bodega.Where(x => x.cod_prod == u.cod_prod).FirstOrDefault();
                
                if (b != null)
                {

                    inventory inv = new inventory()
                    {
                        reg_date = pm.fecha_ingreso,
                        cod_prod = pm.codigo_prod
                    };



                    if (inv.cod_prod != null)
                    {
                        dc.inventory.Remove(b);
                        dc.products.Remove(u);

                        dc.SaveChanges();

                        prodEdit2(prod, bod);
                    }
                }
            }
            return RedirectToAction("prodList", "products");
        }
    }

    [HttpPost]
    public ActionResult prodEdit2(products p, inventory i)
    {
        using (inventarioEntitiesDBA dc = new inventarioEntitiesDBA())
        {
            dc.products.Add(p);
            dc.inventory.Add(i);

            dc.SaveChanges();

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

【讨论】:

    猜你喜欢
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    相关资源
    最近更新 更多