【问题标题】: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 如何更正这个数据库的模型?

标签: c# entity-framework code-first


【解决方案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();

我的数据库显示:

但是如何获取我的订单中的所有元素,例如将价格总和为一个订单价格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多