Использую 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; }
}
Видите какой получился ужасный метод по добавлению блюда в определенный ресторан, если начну делать в той же манере добавление добавки, то будет копи паст ужасного кода, вопрос заключается в том, как лучше обрабатывать данные более элегантно, вышеуказанный код написать лучше и написать метод добавления добавки? И нужно ли поменять структуру таблиц?
Если 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();
}
Как меняется крипторынок и к чему готовиться владельцам криптообменников
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Нужно чтобы при вызове функции undo(Game3) ход отменялся он отменяется но только один раз значение возвращается только на одну позицию как сделать...
Доброго времени сутокДовольно часто в тех заданиях по проектированию БД для хранения изменений или логов, указывается, что создается новая...