Некоторые основные вопросы о дизайне базы данных и о том, как вставить их с помощью LINQ to Entities - PullRequest
1 голос
/ 24 мая 2011

Хорошо, я новичок, так что терпите меня.Попытка внедрить систему заказов и желание сохранить заказы в базе данных с помощью LINQ to Entities.Я могу сделать это сейчас, но для каждого нового объекта, который сохраняется в таблице заказов, вставляется новая строка с новым OrderNo для каждого ProductID, где, как я, очевидно, должен иметь возможность иметь несколько ProductID для каждого OrderNo.

Все очень упрощено, так как я просто тестирую.

У меня есть таблица заказов с такими столбцами:

OrderNo PK, Identity specification
Line int PL
ProductID int

и таблица продуктов

ProductID int PK

Заказсоздается объект сущности, а его свойства заполняются данными из формы, которая публикуется в методе действия.Затем он сохраняется в таблице заказов со следующим кодом:

(DropDownList1Value) имеет значение существующего ProductID, а "DropDownList1Value" - это идентификатор элемента DropDownList в представлении.

[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» и просто увеличить значение «Line» для diff ProductID и как мне вставить такие записи с помощью LinQ вОбъекты, в которых у меня, очевидно, будет много ProductId из нескольких DropDowLists, и все они будут для одного заказа.

В настоящее время у меня есть зависимость внешнего ключа от ProductID в таблице Products, поэтому ни одна запись в таблице Orders не может иметь ProductID, которыйне существует в таблице продуктов.Мне нужно, чтобы таблица зависела от целого ключа, т.е. OrderNo + Line, и имела автоинкремент "Line".

Или есть ли намного лучший способ реализации того, что я собираюсь здесь?

Спасибо.

Ответы [ 2 ]

1 голос
/ 24 мая 2011

Позвольте мне сначала кратко объяснить, что я понял.

Существует счет-фактура, содержащая несколько товаров на один номер заказа.
и вот как выглядит ваш счет:

Order Number: 101
------------------
Sl.       Products
1         3
2         5
3         2

Прежде чем ответить, я хочу отметить, что вы принимаете OrderId из формы (то есть со стороны клиента). Это неправильный и НЕОБЕСПЕЧЕННЫЙ подход. Пусть идентификатор заказа будет автоматически сгенерирован базой данных.

Я бы посоветовал немного подправить дизайн вашей базы данных.
Вот решение, которое будет работать.
Примечание: я хочу, чтобы ваша база данных поддерживала автоинкремент, для 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. Получить последний вставленный идентификатор 3. Введите идентификатор заказа из последнего шага и продукты, которые были приобретены в таблице Order-Detail,

Получить все заказы, сделанные пользователем:
1. Прочитайте из таблицы заказа.

Получить все товары, приобретенные для заказа:
1. Получить детали из Order-Detail
Примечание: вы получите список купленных товаров, используйте Order-detail.id как «Линия»
РЕДАКТИРОВАТЬ:
Спасибо за комментарий HLGEM
Если вы думаете, что цена продукта может измениться, тогда вместо обновления цены добавьте новую строку в таблицу (и пометите старую таблицу так, чтобы она не была видна, вы также можете иметь столбец в новой таблице, указывающий на старую таблицу), таким образом, старая покупка будет указывать на старый продукт, а новые заказы будут указывать на обновленную (новую) строку.

Есть еще один подход к этой проблеме:
сохранить текущую стоимость товара в таблице деталей заказа.

Если вы столкнулись с трудностями в понимании вышеупомянутого решения, здесь есть другое и более простое решение.
В таблице заказов создайте составной первичный ключ, включая OrderNo и Line.
Всякий раз, когда вы вставляете в базу данных, вам нужно будет сгенерировать номер строки в вашем коде, что вы можете сделать, запустив цикл по массиву приобретаемого продукта.

0 голосов
/ 24 мая 2011

Я думаю, что было бы лучше разделить вашу текущую таблицу заказов на две отдельные таблицы:

Таблица заказов

  • (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 и Entity Framework,Он содержит классы для заказов и детали заказа (среди прочих) и объясняет их взаимосвязь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...