Entity framework EF4.1代码优先-如何从多对多分配/删除?
我在产品和产品组之间有一种多对多的关系 首先使用EF4.1代码,在ProductGroup中添加/删除产品时,我会得到奇怪且不一致的结果 我的观点是完美的;它返回一个GroupId和一个列表ProductID。问题出在控制器中,我循环遍历ProductID列表并将其分配/删除到ProductGroup 以下是从我的代码中提取的用于从ProductGroup中删除产品的摘录:Entity framework EF4.1代码优先-如何从多对多分配/删除?,entity-framework,many-to-many,entity-framework-4.1,Entity Framework,Many To Many,Entity Framework 4.1,我在产品和产品组之间有一种多对多的关系 首先使用EF4.1代码,在ProductGroup中添加/删除产品时,我会得到奇怪且不一致的结果 我的观点是完美的;它返回一个GroupId和一个列表ProductID。问题出在控制器中,我循环遍历ProductID列表并将其分配/删除到ProductGroup 以下是从我的代码中提取的用于从ProductGroup中删除产品的摘录: ProductGroup productGroup = _Repository.GetProductGroup(g
ProductGroup productGroup = _Repository.GetProductGroup(groupId);
using (var db = GetDbContext())
{
foreach (var pId in productIds)
{
Product p = _Repository.GetProduct(Convert.ToInt32(pId));
productGroup.Products.Remove(p);
db.Entry(productGroup).State = System.Data.EntityState.Modified;
p.ProductGroups.Remove(productGroup);
db.Entry(p).State = System.Data.EntityState.Modified;
db.SaveChanges();
}
}
基本上,我必须影响产品组和单个产品才能得到任何结果。。。结果好坏参半。例如,在检查DB表(ProductGroupProducts)时,只有一些记录将被删除,但我无法确定哪些记录是和哪些记录不是
我在将产品分配给ProductGroup时遇到类似问题。代码与显而易见的.Add()而不是.Remove()几乎相同
我错过了什么?有人知道一种更好的,希望更一致的方法吗
非常感谢
Radu什么是GetDbContext()
?如果这创建了一个新的上下文,那么db
显然是另一个上下文,而不是您在\u存储库中使用的上下文。(如果它返回与\u Repository
正在使用的上下文相同的上下文,那么using
块很奇怪,因为它在末尾处理上下文,因此也会销毁\u Repository
中的上下文)
您必须将productGroup
和p
附加到进行以下修改的上下文:
ProductGroup productGroup = _Repository.GetProductGroup(groupId);
using (var db = GetDbContext())
{
db.ProductGroups.Attach(productGroup);
foreach (var pId in productIds)
{
Product p = _Repository.GetProduct(Convert.ToInt32(pId));
db.Products.Attach(p);
productGroup.Products.Remove(p);
}
db.SaveChanges();
}
我已经删除了p.ProductGroups.Remove(productGroup)
,因为我认为当您从组中删除产品时,EF将自动执行此操作(但我不确定;您可以在调试器中查看集合)
如果GetDbContext()
确实创建了新的上下文,请重新考虑设计。对于此类操作(读取和更新),您应该只有一个上下文
编辑
这可能更容易:
ProductGroup productGroup = _Repository.GetProductGroup(groupId);
using (var db = GetDbContext())
{
db.ProductGroups.Attach(productGroup);
foreach (var pId in productIds)
{
var p = productGroup.Products
.SingleOrDefault(p1 => p1.ID == Convert.ToInt32(pId))
if (p != null)
productGroup.Products.Remove(p);
}
db.SaveChanges();
}
它将为您保存产品的数据库查询。我假设您使用延迟加载,或者\u Repository.GetProductGroup
为产品集合提供了一个Include
。正确_存储库正在创建一个不同的上下文。现在工作很好;非常感谢!