C# 如何从编辑视图ASP.NET MVC更新两个表?
我试图更新两个表中的数据<代码>产品和C# 如何从编辑视图ASP.NET MVC更新两个表?,c#,asp.net-mvc,entity-framework,razor,C#,Asp.net Mvc,Entity Framework,Razor,我试图更新两个表中的数据产品和库存。表products的主键是cod\u prod,它是产品的条形码。这是与产品表和其他表的关系。对所有字段执行更新,但在数据库管理员中,inventory表中的cod\u prod字段未更新,它仅变为null,在products表中执行更新,reg\u date字段,也会更新库存表中的字段。只有inventory表上的cod\u prod字段没有更新,我不知道为什么 视图模型: public class products { [Display(Name
库存
。表products
的主键是cod\u prod
,它是产品的条形码。这是与产品
表和其他表的关系。对所有字段执行更新,但在数据库管理员中,inventory
表中的cod\u prod
字段未更新,它仅变为null
,在products
表中执行更新,reg\u date
字段,也会更新库存
表中的字段。只有inventory
表上的cod\u 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");
}
}
[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");
}
}
如有任何建议,我们将不胜感激
更新:
产品的型号
:
public partial class products
{
[Display(Name = "Name")]
public string name { get; set; }
[Key]
[Display(Name = "Product Code")]
public string cod_prod { get; set; }
}
存货的型号
:
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; }
}
如果同样的事情发生在某人身上,这就是我写的解决方法,
controller
有两个post
方法,第一个方法删除已更改的字段,保存数据库并将产品
和库存
对象发送到第二个方法,在那里添加模型的新数据并保存。我不得不这样做,因为删除products
表上的PK会导致null
这件事
控制器:
[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");
}
}
[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");
}
}
假设产品和库存表之间有一对一的关系,您的模型在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关系的更多信息。请显示您的模型。我用两个表的模型更新了问题。再次感谢您的建议。在
POST
操作上设置一个断点,查看cod\u prod
是否为空。感谢您的回复,我真的不知道我可以用这种方式进行更新。我发布的解决方案是我能找到的唯一解决问题的方法,但是有了这个解决方案,你可以看出这要容易得多。