3

我有两个实体:

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。它只是 create 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 等于当前用户。哪里有问题?
谢谢。

4

3 回答 3

2

用户可能没有被上下文跟踪。当您将订单添加到上下文时,它还会添加相关实体,然后在保存更改时创建一个新用户(或尝试)。Attach()用户调用之前的上下文_context.Set<T>().Add(entity);

于 2013-02-01T06:48:14.660 回答
1

我猜这个问题与您提供的代码无关。它似乎与您正在初始化的位置有关PcpSession.CurrentUser

似乎PcpSession.CurrentUser对象没有附加到上下文中。在进行Order相关调用之前将此实体获取到上下文或附加它。

于 2013-02-01T06:51:20.297 回答
0

如果不在上下文中附加,则需要附加您的实体。

以 Repository Generic 为例

> public void Add(T entity)
>         {
>             entity.Create = DateTime.Now;
>             db.Set<T>().Attach(entity);  // Add Line 
>             db.Set<T>().Add(entity);
>             Save();
>         }

我不知道它是否干净,但它可以解决问题

于 2018-07-23T10:32:53.600 回答