【问题标题】:.Net Core Entity Framework 5 How To Insert Database An Entity That Not Exists With One To Many Relation Entities That Also Aren't Exists?.Net Core Entity Framework 5 如何将不存在的实体与也不存在的一对多关系实体插入数据库?
【发布时间】:2021-08-19 12:16:50
【问题描述】:

我正在做一个项目,我基本上将这些实体映射到数据库并配置了一对多关系。

    public class Order
    {
        public Order(){}

        public Order(List<OrderItem> orderItems)
        {
            OrderItems = orderItems;
        }

        public int Id { get; set; }
        public List<OrderItem> OrderItems { get; set; }
    }


    public class OrderItem
    {
        public OrderItem(){}

        public OrderItem(int amount, int orderId, Order order, int productId, Product product)
        {
            Amount = amount;
            OrderId = orderId;
            Order = order;
            ProductId = productId;
            Product = product;
        }
        public int Id { get; set; }
        public int Amount { get; set; }
        public int OrderId { get; set; }
        public Order Order { get; set; }
        public int ProductId { get; set; }
        public Product Product { get; set; }
        
    }

我也有这个代码块来插入一个订单实体到数据库

        public Order Add(Order entity)
        {
            using var TContext = new TContext(); // getting appropriate context generic
            var result = context.Entry(entity);
            result.State = EntityState.Added;
            context.SaveChanges();
            return entity;
        }

此时,我想插入一个订单实例,其中添加了订单项目,但订单和订单项目之前都没有保存数据库。插入订单后,我还希望将订单商品与订单一起插入数据库,但我试过了,但没有用。当我阅读 EntityFramework 文档here 时,如果从数据库中获取其中一项是可能的,但我需要一次插入所有相关数据。可以通过交易来做到这一点。例如,通过交易我可以插入订单,然后我可以插入订单商品,但是 是否有任何配置或其他东西可以使 EntityFramework 在订单中跟踪订单商品列表,具有一对多关系并且在插入新订单之前没有插入?

添加注释的部分

        [HttpPost]
        override public async Task<IActionResult> Post(Order entity){
           //entity.OrderItems = null; // I tried to prevent exception
           //entity.OrderItems[0].Order = entity // I tried to prevent exception with 1 list element
           var db = new EFMyFactory();
           db.Orders.Add(entity);
           db.SaveChanges();
           

           /* THIS PART WORKS
           var db = new EFMyFactory();
           var e = db.Entry(entity);
           e.State = EntityState.Added;
           db.SaveChanges();
           */     

           
           return Ok();
        }

此代码也不例外,但 web api 返回 415,如下所示。 db.Orders.Add(entity) 之后的行不被执行。

{ “类型”:“https://tools.ietf.org/html/rfc7231#section-6.5.13”, "title": "不支持的媒体类型", “状态”:415, “traceId”:“00-7afc8f3ea707214b897d04a298f7b3a6-fc9689395692c54f-00” }

【问题讨论】:

    标签: c# entity-framework insert one-to-many asp.net-core-5.0


    【解决方案1】:

    试试这个

            using (var Context = new TContext()) // getting appropriate context generic
            {
            var result = Context.Orders.Add(entity); // I've assumed that DBSet for your order table is Orders
            Context.SaveChanges();
            }
    

    【讨论】:

    • 可能不行。在Context.Orders.Add(entity) 行之后,它会抛出异常或其他东西,并且 web api 返回 415 不受支持的媒体类型。上述行之后的其他行不执行。我也尝试添加一个带有 null OrderItems 属性的 Order 实例并将 Order 引用传递给 OrderItems 列表,但仍然出现错误。
    • 我需要看API body,请把异常详情放在这里
    • 问题已编辑。
    • 亲爱的,我不知道你想用你的代码做什么,所以它会抛出一个你提到的异常,但是我会尝试以我觉得有帮助的方式重写你的代码order.OrderItems = null; order.OrderItems[0].Order = order; // I don't know what you tried to do here, but it will throw an reference not set to an instance exception _context.orders.Add(order); _context.SaveChanges();
    • 我觉得问题出在你的post request body,应该是这样的:{ "orderItems": [ { "amount": 10, "product": { "name": "Test new product" } } ] }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 2017-08-18
    • 2017-05-16
    • 1970-01-01
    相关资源
    最近更新 更多