EntityFramework未在实体

时间:2016-11-09 11:41:32

标签: c# entity-framework

我有一个问题,即使用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      

修改 在用户想要创建订单的某个时刻,我们称之为:

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);

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

2 个答案:

答案 0 :(得分:1)

您在此声明中覆盖了订单列表:

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

我很确定这是混乱的东西。如果您将行更改为:

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

我相信它应该有效。但是,这始终将所有订单作为新订单添加到客户。如果这不是您想要的,您可以使用添加和删除调用的组合来更新Orders集合,而不是仅添加它们。但是要测试它是否可以保存任何东西,你现在就可以使用AddRange()。

此外,您不应设置实体的状态,除非您附加实体(您不是)。所以放弃这些行

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

答案 1 :(得分:0)

问题是更新用户无济于事。您需要强制更新包含对用户IMO的引用的订单。不添加它们,强制更新,在DbEntry中设置State。