Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework EF4.1代码优先-如何从多对多分配/删除?_Entity Framework_Many To Many_Entity Framework 4.1 - Fatal编程技术网

Entity framework EF4.1代码优先-如何从多对多分配/删除?

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

我在产品和产品组之间有一种多对多的关系

首先使用EF4.1代码,在ProductGroup中添加/删除产品时,我会得到奇怪且不一致的结果

我的观点是完美的;它返回一个GroupId和一个列表ProductID。问题出在控制器中,我循环遍历ProductID列表并将其分配/删除到ProductGroup

以下是从我的代码中提取的用于从ProductGroup中删除产品的摘录:

    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

正确_存储库正在创建一个不同的上下文。现在工作很好;非常感谢!