【发布时间】: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