Корзина на бэкэнде

283
06 октября 2017, 14:33

Использую entity framework,code first, решил сделать корзину на серверной стороне, чтобы заказ из мобильного приложения можно было продолжить на сайте. Вот такая структура таблиц корзины

    CREATE TABLE [dbo].[ShoppingCarts] (
    [Id]          INT            IDENTITY (1, 1) NOT NULL,
    [PhoneNumber] NVARCHAR (MAX) NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);
CREATE TABLE [dbo].[ShoppingCartRestaurants] (
    [Id]             INT            IDENTITY (1, 1) NOT NULL,
    [ShoppingCartId] INT            NOT NULL,
    [RestaurantId] INT NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_ShoppingCartRestaurants_ToShoppingCarts] FOREIGN KEY ([ShoppingCartId]) REFERENCES [dbo].[ShoppingCarts] ([Id])
);
CREATE TABLE [dbo].[ShoppingCartMenuItems] (
    [Id]                       INT            IDENTITY (1, 1) NOT NULL,
    [ShoppingCartRestaurantId] INT            NOT NULL,
    [MenuItemId]                   INT            NOT NULL,
    [Quantity]                 INT            NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_ShoppingCartMenuItems_ToShoppingCartRestaurants] FOREIGN KEY ([ShoppingCartRestaurantId]) REFERENCES [dbo].[ShoppingCartRestaurants] ([Id])
);
CREATE TABLE [dbo].[ShoppingCartModifiers] (
    [Id]                     INT            IDENTITY (1, 1) NOT NULL,
    [ShoppingCartMenuItemId] INT            NOT NULL,
    [ModifierId]                   NVARCHAR (MAX) NOT NULL,
    [Quantity]               INT            NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_ShoppingCartModifiers_ToShoppingCartMenuItems] FOREIGN KEY ([ShoppingCartMenuItemId]) REFERENCES [dbo].[ShoppingCartMenuItems] ([Id])
);

То есть, есть четыре таблицы корзина->ресторан->блюдо->добавки к блюду, пользователь в системе может быть только зарегистрированный, так что создавать корзину я могу сразу с добавления блюда в корзину(модели по добавлению тоже приложу), так как запрос который придет, по нему я могу по токену вытянуть данные о пользователе, вот какой код у меня получается, смотрится не очень:

public void AddMenuItemToShoppingCart(ShoppingCartMenuItemModel shoppingCartMenuItemModel)
        {
            string phoneNumber = "666"; //get phoneNumber
            var shoppingCart = _applicationDbContext.ShoppingCarts.FirstOrDefault(s => s.PhoneNumber == phoneNumber);
            if (shoppingCart == null)
            {
                _applicationDbContext.ShoppingCarts.Add(new ShoppingCart()
                {
                    PhoneNumber = phoneNumber
                });
                _applicationDbContext.SaveChanges();
            }
            shoppingCart = _applicationDbContext.ShoppingCarts.FirstOrDefault(s => s.PhoneNumber == phoneNumber);
            var shoppingCartRestaurant =
                shoppingCart.ShoppingCartRestaurants.FirstOrDefault(
                    r => r.RestaurantId == shoppingCartMenuItemModel.RestaurantId);
            if (shoppingCartRestaurant == null)
            {
                shoppingCart.ShoppingCartRestaurants.Add(new ShoppingCartRestaurant()
                {
                    RestaurantId = shoppingCartMenuItemModel.RestaurantId
                });
                _applicationDbContext.SaveChanges();

                shoppingCartRestaurant =
                    shoppingCart.ShoppingCartRestaurants.FirstOrDefault(
                        r => r.RestaurantId == shoppingCartMenuItemModel.RestaurantId);

                var shoppingCartMenuItem =
                    shoppingCartRestaurant.ShoppingCartMenuItems.FirstOrDefault(
                        m => m.MenuItemId == shoppingCartMenuItemModel.MenuItemId);
                if (shoppingCartMenuItem == null)
                {
                    shoppingCartRestaurant.ShoppingCartMenuItems.Add(new ShoppingCartMenuItem()
                    {
                        MenuItemId = shoppingCartMenuItemModel.MenuItemId
                    });
                    _applicationDbContext.SaveChanges();
                }
                else
                {
                    shoppingCartMenuItem =
                        shoppingCartRestaurant.ShoppingCartMenuItems.FirstOrDefault(
                            m => m.MenuItemId == shoppingCartMenuItemModel.MenuItemId);
                    shoppingCartMenuItem.Quantity += 1;
                    _applicationDbContext.SaveChanges();
                }
            }

Модель на добавление блюда:

public class ShoppingCartMenuItemModel
    {
        public int RestaurantId { get; set; }
        public int MenuItemId { get; set; }
    }

Модель на добавление добавки к блюду:

public class ShoppingCartModifierModel
    {
        public int RestaurantId { get; set; }
        public int MenuItemId { get; set; }
        public int ModifierId { get; set; }
    }

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

Answer 1

Если shoppingCartMenuItem уже существует, то ее получать второй раз не надо.

var shoppingCartMenuItem = shoppingCartRestaurant.ShoppingCartMenuItems.FirstOrDefault(m => m.MenuItemId == shoppingCartMenuItemModel.MenuItemId);
if (shoppingCartMenuItem == null)
{
    shoppingCartRestaurant.ShoppingCartMenuItems.Add(new ShoppingCartMenuItem()
    {
        MenuItemId = shoppingCartMenuItemModel.MenuItemId
    });
    _applicationDbContext.SaveChanges();
}
else
{

shoppingCartMenuItem = shoppingCartRestaurant.ShoppingCartMenuItems.FirstOrDefault(m => m.MenuItemId == shoppingCartMenuItemModel.MenuItemId);

    shoppingCartMenuItem.Quantity += 1;
    _applicationDbContext.SaveChanges();
}
READ ALSO
Установить motion в Unity через код

Установить motion в Unity через код

Каким образом установить Motion через код?

188
Отмена хода в пятнашках

Отмена хода в пятнашках

Нужно чтобы при вызове функции undo(Game3) ход отменялся он отменяется но только один раз значение возвращается только на одну позицию как сделать...

261
C# entity framework. Несколько таблиц для одной сущности в БД

C# entity framework. Несколько таблиц для одной сущности в БД

Доброго времени сутокДовольно часто в тех заданиях по проектированию БД для хранения изменений или логов, указывается, что создается новая...

240