Реализация корзины магазина в EntityFramework

185
01 июня 2018, 18:40

База данных интернет магазина. Есть два класса. User и Book. Хочу создать третий класс Order, в который буду помещать заказы. Проблема вот в чем. У одного пользователя в заказе может быть множество книг, но как это описать в EF? C помощью допкласса UserBookOrder я не знаю как сделать чтобы у в одном заказе было множество книг

public class UserBookOrder
    {
        public int UserId { get; set; }
        public User User { get; set; }
        public int BookId { get; set; }
        public Book Book { get; set; }
    }

    public class User
        {
            public int UserId { get; set; }
            public string Name { get; set; }
            public string Email { get; set; }
        }
    public class Book
        {
            public int BookId { get; set; }
            public string View { get; set; }
            public string Fio { get; set; }
            public string Name { get; set; }
        }
Answer 1

В принципе у вас все верно описано. Для решения вашей задачи, необходим дополнительный класс, по вашему Order, который будет в себе хранить UserId и BookId всех пользователей и отмеченных продуктов. В итоге по ссылке на пользователя вы сможете получить все книги,а точнее их Id, и уже по Id получить название книги.

public class Order()
{
    public int UserId {get;set;}
    public int BookId {get;set;}
}

Получить все книги у пользователя

var UserBook = Order.Where(o=>o.UserId == UserId).ToList();
Answer 2

Рекомендую.

public class Order()
{
    // можно будет получить заказ по id
    public int Id {get;set;} 

    // ссылка на юзера, что б было удобней к нему обращаться из корзины, например
    public User User {get;set;} // или UserId

    // Хотя многие, в том числе и я, рекомендовали бы пользоваться ICollection<Book>.
    public IEnumerable<Book> BooksInOrder {get;set;} 
}

И теперь данную сущность из базы можно тащить запросом по Id заказа:

// где Orders - коллекция всех ваших заказов
Orders.FirstOrDefault(ord => ord.id == myOrderId);

Либо по Id юзера:

Orders.FirstOrDefault(ord => ord.User == myCurrentUser);

Таким образом, вы получите и User'a и коллекцию заказанных Books в контексте конкретного заказа.

UPD: Так же, имело бы смысл(если есть необходимость), в этом классе Order добавить поле DateTime OrderDate, для того, что бы не было необходимости тянуть обо всех заказах по конкретному User'у.

Например:

//заберем сегодняшние заказы Orders.FirstOrDefault(ord => ord.OrderDate == DateTime.Today);

// заберем заказы от 5 дней назад до сегодняшнего Orders.FirstOrDefault(ord => ord.OrderDate <= DateTime.Today && ord.OrderDate >= DateTime.Today.AddDays(-5));

// заберем сегодняшний заказ(ы) конкретного пользователя Orders.FirstOrDefault(ord => ord.User.Id == MyUser && ord.OrderDate == DateTime.Today);

READ ALSO
Remove range в EF Core и транзакция

Remove range в EF Core и транзакция

Когда мы производим удаление с помощью Remove range в ef core у нас все выполняется в транзакции? Если, что то не удалится из списка удаляемых объектов...

190
Yii2 ActiveQuery сложный запрос

Yii2 ActiveQuery сложный запрос

Есть 2 таблицы: user и transactionСвязь один ко многим (1 пользователь – много транзакций)

300
Вывод отдельной записи

Вывод отдельной записи

У меня есть программа в которой выводятся данные в QTableView из таблицы mysqlКак реализовать что бы при нажатии на запись таблицы в списке подробная...

191
mysql select xml символ между элементами нод

mysql select xml символ между элементами нод

Всем привет! подскажите есть структура xml:

210