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);
永远不会返回,当您将代码更改为同步运行时,这也不会改变。所以没有线程问题
您正在重写此语句中的订单列表:
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。