实体框架在调用SaveChanges时创建新记录

时间:2013-02-01 06:30:48

标签: c# entity-framework entity-framework-5

我有两个实体:

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

3 个答案:

答案 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();
>         }

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