2012-10-31 205 views
0

我按照我的朱莉Lermans书编程实体框架阅读有关EF库模式:的DbContext实体框架的通用仓库 - 外键例外更新实体关系

我有具有多对多名为Customer的实体与实体收藏

这里关系是一个更新的一些示例代码,客户

customer.CustomerLocation_ID = 5;  

customer.Favourites.clear(); 

customer.State = State.Modified; 
customerRepository.InsertOrUpdate(customer); 

插入然后将做到以下几点:

Entry(entity).State = EntityState.Modified; 

foreach (var entity in this.ChangeTracker.Entries<IEntityState>()) 
{ 
    IEntityState stateInfo = entity.Entity; 
    entity.State = StateHelpers.ConvertState(stateInfo.State); 
} 

后来总算:

context.SaveChanges(); 

一旦保存,我得到一个唯一的密钥异常的收藏,因为收藏夹名称是唯一的。但我没有在收藏夹中添加任何内容。

当我删除.clear()行时,一切都很好保存。

更新:

我在这段代码只是尝试一些东西,现在的作品加入。

foreach (var fav in customer.Favourites) 
{ 
    fav.State = State.Modified; 
} 

这是否意味着即使我正在影响客户,我仍然需要将收藏夹标记为已修改,以便跟踪和更新它们?我只是不认为我必须这样做。

+1

您正在对您的客户进行一系列关于已清除收藏夹的删除操作(实际上,您是在删除与此客户关联的所有收藏夹链接记录)。你确定这是预期的效果吗? – Tejs

+0

这就是主意。我想删除所有客户的最爱。现在就去更新这个问题。 – LivingOnACloud

回答

0

如果您使用实体框架,它应该是为做这个简单:

using(var myContext = new MySiteDbContextClassName()) 
{ 
    var selectedCustomer = myContext.Customers.FirstOrDefault(x => x.CustomerId == someCustomerId); 

    if(selectedCustomer != null) 
    { 
      selectedCustomer.Favorites.Clear(); 
      myContext.SaveChanges(); 
    } 
} 

如果不工作的话听起来有点像你的配置/映射是错误的,你”你需要检查你的配置。

+0

如果我这样做,那么它会正常工作。但是我使用的存储库模式涉及将实体发送到此函数中,然后工作单元将保存所有存储库工作中的更改。 – LivingOnACloud

+0

如果你的上下文总是可用的,那么你只能在最后调用'SaveChanges',它仍然是相同数量的代码。你不必在状态管理的背景下搞清楚上下文在做什么。上下文是跟踪正在清除的最爱,等等。 – Tejs

+0

干杯Tejs,我要走了,想一分钟。由于我无法访问Context,并且在保存更改时正在处理新的上下文,因此使用存储库模式是有意义的。 – LivingOnACloud