首页 > 解决方案 > EF Core 表首先不在数据库中保存实体

问题描述

我是 EF 新手(表优先),我不知道为什么这些相关实体根本没有保存到我的数据库中。这些是相关的实体,UserProfile 有一组 Carts

public partial class UserProfile
    {
        public UserProfile()
        {
            Cart = new HashSet<Cart>();
            Naquestions = new HashSet<Naquestions>();
        }

        public int Id { get; set; }
        public string BotUserId { get; set; }
        public int? PrestashopId { get; set; }
        public bool Validated { get; set; }
        public int Permission { get; set; }
        public DateTime CreationDate { get; set; }

        public ICollection<Cart> Cart { get; set; }
        public ICollection<Naquestions> Naquestions { get; set; }
    }

购物车有一组 OrderLines

   public partial class Cart
    {
        public Cart()
        {
            OrderLine = new HashSet<OrderLine>();
            OrderRequest = new HashSet<OrderRequest>();
        }

        public int Id { get; set; }
        public int UserId { get; set; }
        public bool Active { get; set; }

        public UserProfile User { get; set; }
        public ICollection<OrderLine> OrderLine { get; set; }
        public ICollection<OrderRequest> OrderRequest { get; set; }
    }

当我尝试添加它们时:

public async Task AddOrderLineToUser(string botId, OrderLine orderLine)
        {
            using (var context = ServiceProvider.CreateScope())
            {
                var db = context.ServiceProvider.GetRequiredService<GretaDBContext>();

                var user = await UserController.GetUserByBotIdAsync(botId);

                var latestCart = user.Cart.OrderByDescending(c => c.Id).FirstOrDefault();

                if (latestCart != null && latestCart.Active)
                {
                    latestCart.OrderLine.Add(orderLine);
                }
                else
                {
                    var newCart = new Cart()
                    {
                        Active = true,
                    };
                    newCart.OrderLine.Add(orderLine);
                    user.Cart.Add(newCart);
                }

                await db.SaveChangesAsync();
            }
        }

db.SaveChangesAsync()一旦被调用,什么都不会保存到数据库中。

标签: c#asp.net-coreentity-framework-core

解决方案


正如@Caius Jard在评论中所说,这似乎user来自另一个背景。尝试

 if (latestCart != null && latestCart.Active)
 {
      orderLine.CartId = latestCart.Id;
      db.OrderLines // I assume it is name of your orderlines DbSet
         .Add(orderLine);
 }
 else
 {
      var newCart = new Cart()
      {
           Active = true,
           UserId = user.Id,
      };
      newCart.OrderLine.Add(orderLine);
      db.Carts // also assuming name of DbSet
         .Add(newCart);
 }

你也可以看看Attach方法。

但我会说,总的来说,你做的事情并不好。通常不需要创建新的作用域,db context 应该通过 ctor 注入到相应的类中。UserController如果您仍然需要创建新范围,那么解决也是有意义的。也是UserController一个ASP控制器?


推荐阅读