如何使用实体框架将相同的披萨添加到订单表
Posted
技术标签:
【中文标题】如何使用实体框架将相同的披萨添加到订单表【英文标题】:How to add the same Pizza to Order table using Entity Framework 【发布时间】:2019-07-12 10:15:05 【问题描述】:我在订购相同的比萨时遇到问题。在代码中,当我调试时一切正常,但在数据库中我无法添加相同的比萨,而数据库仅添加 1 个相同的比萨。
我的订单类:
public class Order
public Order()
Sauces = new List<Sauce>();
Pizzas = new List<Pizza>();
public int OrderId get; set;
public virtual ICollection<Sauce> Sauces get; set;
public virtual ICollection<Pizza> Pizzas get; set;
我有一个方法:
var newOrder = new Order();
var listsauces = new List<Sauce>();
listsauces.Add(ctx.Sauces.Where(x => x.Id == 3).FirstOrDefault());
listsauces.Add(ctx.Sauces.Where(x => x.Id == 3).FirstOrDefault());
newOrder.Sauces = listsauces;
var listPizzas = new List<Pizza>();
listPizzas.Add(ctx.Pizzas.Where(x => x.Id == 1).FirstOrDefault());
listPizzas.Add(ctx.Pizzas.Where(x => x.Id == 2).FirstOrDefault());
listPizzas.Add(ctx.Pizzas.Where(x => x.Id == 1).FirstOrDefault());
newOrder.Pizzas = listPizzas;
ctx.Orders.Add(newOrder);
ctx.SaveChanges();
和ofc数据库显示
如何将相同的披萨添加到相同的订单中?
【问题讨论】:
发生这种情况是因为您使用的是 N x N 关系。您需要创建一个包含 Order、Pizza 和 Quantity 成员的新实体。 你的设计理念有问题 @TanvirArjel 如何更正这个数据库的模型? 【参考方案1】:尝试类似的方法。
public class OrderPizzaItem
public Pizza Pizza get; set;
public int Quantity get; set;
public class OrderSauceItem
public Pizza Pizza get; set;
public int Quantity get; set;
public class Order
public Order()
Sauces = new List<OrderSauceItem>();
Pizzas = new List<OrderPizzaItem>();
public int OrderId get; set;
public virtual ICollection<OrderSauceItem> Sauces get; set;
public virtual ICollection<OrderPizzaItem> Pizzas get; set;
var newOrder = new Order();
var listsauces = new List<OrderSauceItem>();
listsauces.Add(new OrderSauceItem Sauce = ctx.Sauces.Where(x => x.Id == 3).FirstOrDefault(), Quantity = 2);
newOrder.Sauces = listsauces;
var listPizzas = new List<OrderPizzaItem>();
listPizzas.Add(new OrderPizzaItem Pizza = ctx.Pizzas.Where(x => x.Id == 1).FirstOrDefault(), Quantity = 2);
listPizzas.Add(new OrderPizzaItem Pizza = ctx.Pizzas.Where(x => x.Id == 2).FirstOrDefault(), Quantity = 1)
newOrder.Pizzas = listPizzas;
ctx.Orders.Add(newOrder);
ctx.SaveChanges();
附言。请检查此代码,因为我在没有检查语法的情况下编写了文本。
【讨论】:
好的,但是如何对 OnModelCreating 方法建模以添加此数据,因为当我想创建迁移时,我收到一个错误“'OrderSauceItems' 基于没有定义键的类型'OrderSauceItem'。”跨度> 在你需要验证之前我是怎么告诉你的。只需添加一个标记为 PK 的 ID。【参考方案2】:@andercruzbr 这是我的数据库上下文:
public DbSet<Pizza> Pizzas get; set;
public DbSet<Sauce> Sauces get; set;
public DbSet<Idgredient> Idgredients get; set;
public DbSet<Order> Orders get; set;
public DbSet<OrderSauceItem> OrderSauce get; set;
public DbSet<OrderPizzaItem> OrderPizza get; set;
public DbSet<PizzaIdgredientItem> PizzaIdgredient get; set;
当我在数据库中有数据时没关系:
var newOrder = new Order();
var listsauces = new List<OrderSauceItem>();
listsauces.Add(new OrderSauceItem SauceId = ctx.Sauces.Where(x => x.Id == 3).FirstOrDefault(), Quantity = 1 );
newOrder.Sauces = listsauces;
var listPizzas = new List<OrderPizzaItem>();
listPizzas.Add(new OrderPizzaItem PizzaId = ctx.Pizzas.Where(x => x.Id == 1).FirstOrDefault(), Quantity = 2 );
listPizzas.Add(new OrderPizzaItem PizzaId = ctx.Pizzas.Where(x => x.Id == 2).FirstOrDefault(), Quantity = 2 );
newOrder.Pizzas = listPizzas;
ctx.Orders.Add(newOrder);
ctx.SaveChanges();
我的数据库显示:
但是如何获取我的订单中的所有元素,例如将价格总和为一个订单价格。
【讨论】:
以上是关于如何使用实体框架将相同的披萨添加到订单表的主要内容,如果未能解决你的问题,请参考以下文章
实体框架,如何将 IQueryable 与多个 where 转换为 SQL 一起使用?