EntityFramework不保存实体上的新数据

本文关键字:数据 新数据 保存 实体 EntityFramework | 更新日期: 2023-09-27 18:17:01

我有一个关于使用EntityFramework和Domain Models用新数据更新现有用户的问题。或者更像是一个问题。

当向用户添加一个新订单时,在将所述Order转换为OrderEntity然后将其添加到UserEntity并将其持久化到数据库后,给定的订单不被保存。

这里有一个IUserModel:

public interface IUser
{
     int ID { get; }
     List<IOrder> Orders { get; }
}

和这里的实体UserEntity:

public class UserEntity
{
     int ID { get; set; }
     public List<OrderEntity> Orders { get; set; }
}

我们这里有一个名为PersistenceService的服务:

public async Task<bool> UpdateInformation(IUser user)
{
     using (var databaseContext = new DatabaseContext())
     {
         var userEntity = await database.Users.Include(u => u.Orders)
                          .FirstOrDefaultAsync(x => x.ID == user.ID);
         userEntity.Orders = user.Orders.ToEntity(); // Extension (convert to entity)         
         databaseContext.Entry(userEntity).State 
                      = EntityState.Modified; // Do we need this?
         databaseContext.Entry(userEntity.Orders).State 
                      = EntityState.Modified; // Do we need this?
         await databaseContext.SaveChangesAsync();
     }
}

数据库中的表是这样的:

Orders                                      User
--------                                    --------
int ID                                      int ID
Money Price 
int UserId -- foreign key to user that owns this order      
编辑:

当用户想要创建一个Order时,我们调用do this:

public async void AddNewOrder(IOrder order)
{
    IUser user = GetActiveUser(); // This just return an IUser
    var persistenceService = GetPersistenceService(); // returns instance of persistence service
    user.Orders.Add(order);
    await persistenceService.UpdateInformation(user);
}

编辑09-11-2016:经过更多调试后,它看起来像这样:

await persistenceService.UpdateInformation(user);

永远不会返回,当您将代码更改为同步运行时,这也不会改变。所以没有线程问题

EntityFramework不保存实体上的新数据

您正在重写此语句中的订单列表:

userEntity.Orders = user.Orders.ToEntity(); // Extension (convert to entity)

我很确定这就是把事情搞砸的原因。如果将该行改为:

userEntity.Orders.AddRange(user.Orders.ToEntity());

我相信它会起作用的。然而,这总是将所有订单作为新订单添加给客户。如果这不是您想要的,您可以组合使用Add和Remove调用来更新Orders集合,而不仅仅是添加它们。但是为了测试它是否保存了任何内容,你现在可以使用AddRange()。

另外,你不应该设置实体的状态,除非你附加了它们(而你并没有)。删掉这些行

     databaseContext.Entry(userEntity).State 
                  = EntityState.Modified; // Do we need this?
     databaseContext.Entry(userEntity.Orders).State 
                  = EntityState.Modified; // Do we need this?

问题是更新User没有帮助。您需要强制更新包含对用户引用的订单,IMO。不添加它们,强制更新,在dbtry中设置State。