问题描述
||
好吧,我是新手,所以请多多包涵。
尝试实现订购系统并希望
使用LINQ to Entities将订单保存到数据库。我现在可以做到
但是对于保存到订单表中的每个新对象
插入新行,为每个ProductID添加新的OrderNo
每个订单号应具有多个ProductID。
我正在测试时,一切都非常简化。
我有这样的列的订单表:
OrderNo PK,Identity specification
Line int PL
ProductID int
和产品表
ProductID int PK
实例实体对象及其属性被实例化
从表单中的数据填充到发布到操作方法的表单中。
然后使用以下代码将其保存到订单表:
(DropDownList1Value)具有现有ProductID的值,并且\“ DropDownList1Value \”是视图中DropDownList元素的ID。
[HttpPost]
public ActionResult OrderProcessor()
{
int productId = int.Parse(Request.Form[\"DropDownList1Value\"]);
var order = new Order();
order.ProductID = productId;
context.Orders.AddObject(order);
context.SaveChanges();
return View(order);
}
因此,插入的记录如下所示:
抱歉,无法在此编辑器中将其对应的列名称下的值对齐。
OrderNo Line ProductID
101 0 3
102 0 5
103 0 2
在我想要这样的地方:
OrderNo Line ProductID
101 1 3
101 2 5
101 3 2
102 1 2
所以我想知道如何修改订单表
可以有多个具有相同\“ OrderNo \”的记录,而对于差异ProductID \只是\\“ Line \”递增,我该如何使用LinQ将此类记录插入Entities,
我显然将从多个DropDowLists中获得许多ProductId
它们都将用于一个订单。
目前,我对Products表中的ProductID具有外键依赖关系,
因此,“订单”表中的任何记录都不能具有“产品”表中不存在的ProductID。
我需要使表依赖于整个订单号,即OrderNo + Line
并具有\“ Line \\”自动递增。
还是有更好的方法来实现我在这里的目标?
谢谢。
解决方法
首先让我简要解释一下我的理解。
有一张发票,其中包含一个订单号的几种产品。
这是您的发票的样子:
Order Number: 101
------------------
Sl. Products
1 3
2 5
3 2
在回答之前,我想指出一下,您是从表单(即从客户端)获取OrderId的。这是一种错误且不安全的方法。让订单ID由数据库自动生成。
我建议稍微调整一下数据库设计。
这是一个可行的解决方案。
注意:我正在考虑您的数据库支持自动递增,对于MS SQL用IDENTITY代替它,对于Oracle,您需要创建一个序列。
Product (
id INT PK AUTO-INCREMENT
);
Order (
id INT PK AUTO-INCREMENT
user-id INT FK # user who purchased
### and other common details Like date of purchase etc.
);
Order-Detail (
id INT PK AUTO-INCREMENT
order-id INT FK # Common order id
pdt-id INT FK # product which was purchased.
);
购买时:
1.在订单表中插入一行
2.获取最后插入的ID
3.在订单明细表中插入上一步的订单ID和购买的产品,
提取用户下的所有订单:
1.从订单表中读取。
获取订单购买的所有产品:
1.从订单明细中获取明细
注意:您将获得购买的产品列表,将Order-detail.id用作\“ Line \”
编辑:
感谢HLGEM的评论
如果您认为某产品的价格可能会发生变化,则可以在表中添加新行(并标记旧表以使其不可见,而不是更新价格),还可以在新表中有一个指向旧表的列,因此,旧购买将指向旧产品,新订单将指向更新(新)行。
有另一种方法可以解决此问题:
将产品的当前成本存储在订单明细表中。
如果您在理解以上解决方案时遇到困难,那么这里是另一种更简单的解决方案。
在订单表中,制作一个包含OrderNo和Line的复合主键。
每当插入数据库时,您都需要在代码中生成行号,您可以通过在要购买的一系列产品上循环运行来实现。
,我认为最好将当前的Order表拆分为两个单独的表:
订单表
(PK,身份规范)OrderId
也许其他字段如发票地址,收货地址等。
OrderLine表
(PK,身份规范)OrderLineId
(从FK到订购表)OrderId
(从FK到产品表)ProductId
对于这两个表,您的类模型中都有一个实体:class Order
和class OrderLine
,它们之间是一对多的关系,因此Order
有一个OrderLines
的集合。
创建具有所有订单行的订单将如下所示:
var order = new Order();
foreach (var item in collection)
{
var orderLine = new OrderLine()
// Get productId from your DropDownLists
orderLine.ProductId = productId;
order.OrderLines.Add(orderLine);
}
context.Orders.AddObject(order);
context.SaveChanges();
编辑
MVC MusicStore教程可能还有助于使用ASP.NET MVC和实体框架创建订单处理系统的第一步。它包含订单和订单详细信息(以及其他)的类,并说明它们之间的关系。