如何使用实体框架将相同的披萨添加到订单表

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 一起使用?

多对多(自相关)特定订单实体框架

实体框架:更新连接表

如何使用实体框架将大量数据延迟加载到 GridView [关闭]

Spring数据查询dsl如何添加订单?