我有一个问题,即使用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);
永远不会返回,当您将代码更改为同步运行时,这不会发生变化。所以它没有线程问题。
答案 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。