我有两个实体:
public class Order:Entity
{
public virtual User User { get; set; }
...
}
public class User:Entity
{
public virtual ICollection<Order> Orders { get; set; }
...
}
接下来,我创建了订单:
var order = _orderService.CreateTransientOrder(orderNumbers, PcpSession.CurrentUser);
PcpSession.Order = order;
这是CreateTransientOrder
。它只创建Order
,但不保存到数据库中:
public Order CreateTransientOrder(string orderNumbers, User currentUser)
{
...fill fields
order.User = currentUser;
return order;
}
现在一切都好。接下来,我将订单保存到数据库:
_orderService.CreateOrder(PcpSession.Order);
这是CreateOrder
:
public void CreateOrder(Order order)
{
order.OrderDate = DateTime.Now;
_repository.Save(order);
_repository.SaveChanges();
}
这是我的Save
存储库方法:
public void Save<T>(T entity) where T : class, IEntity
{
_context.Set<T>().Add(entity);
}
在数据库中调用SaveChanges
时,创建具有新ID的新用户,并且订单具有新的User_Id。在CreateOrder
方法的调试器中,Id等于当前用户。哪里有问题?
谢谢。
答案 0 :(得分:2)
用户可能没有被上下文跟踪。当您向上下文添加订单时,它还会添加相关实体,然后在保存更改时创建新用户(或尝试)。在致电Attach()
之前,{}将用户_context.Set<T>().Add(entity);
发送到上下文。
答案 1 :(得分:1)
我猜问题与您提供的代码无关。这似乎与您初始化PcpSession.CurrentUser
的位置有关。
似乎PcpSession.CurrentUser
对象未附加到上下文中。在进行Order
相关调用或附加之前,请将此实体提取到上下文。
答案 2 :(得分:0)
如果未在上下文中附加,则需要附加您的实体。
以通用存储库为例
> public void Add(T entity)
> {
> entity.Create = DateTime.Now;
> db.Set<T>().Attach(entity); // Add Line
> db.Set<T>().Add(entity);
> Save();
> }
我不知道它是否干净,但是可以解决问题