有关数据库设计的一些基本问题,以及如何使用LINQ相应地插入到实体中

问题描述

|| 好吧,我是新手,所以请多多包涵。 尝试实现订购系统并希望 使用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和实体框架创建订单处理系统的第一步。它包含订单和订单详细信息(以及其他)的类,并说明它们之间的关系。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...