2013-02-01 150 views
2

新的記錄,我有兩個實體:實體框架創建時調用SaveChanges

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等於當前用戶。問題在哪裏?
謝謝。

回答

2

用戶可能未被上下文跟蹤。當您向上下文添加訂單時,它還會添加相關實體,然後在保存更改時創建新用戶(或嘗試)。 Attach()用戶在調用_context.Set<T>().Add(entity);之前的上下文。

+0

我在使用泛型上下文。我不知道如何去做。 – user1260827

+0

@ user1260827您是否擁有訂單中可用的用戶外鍵?也就是說,不是使用'order.User = currentUser'來設置與'order.UserId = currentUser.UserId'的關聯。 – 2013-02-01 06:54:42

1

我想這個問題與您提供的代碼無關。這似乎與您初始化的位置有關PcpSession.CurrentUser

看起來PcpSession.CurrentUser對象沒有附加到上下文。在使您撥打Order相關電話或附加電話之前,請將此實體提取到上下文中。

相關問題