刷新EF 6 DBContext

时间:2015-04-23 14:42:16

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

我正在使用Entity Framework 6,我有一个产品对象,其中包含如下变体列表:

public class Product
{
    public int ProductId { get; set;}

    public virtual ICollection<Variant> Variants { get; set;}

    ... other properties
}

public class Variant
{
    public int VariantId { get; set;}

    public int ProductId { get; set;}

    public virtual Product Product { get; set;}

    public int StoreId { get; set;}

    ... other properties
}

我用它来从上下文中获取产品:

public static GetProducts()
{
    using (MyDBContext context = new MyDBContext())
    {
        return context.Products.Include(p => p.Variants);
    }
}

现在一切正常,当我得到Product时,它会回复变体。但是,今天早上我愚蠢地使用了上下文中的Product而不是DTO,并根据StoreId过滤了变体,现在每当我得到Product时,它只返回变体该商店(即使我从未提交任何更改)。

我检查了数据库,所有变种仍然存在,所以如何重置我的上下文,以便我再次获得所有变种。

我尝试了以下内容:

  • 重置iis
  • 清理并重建解决方案
  • 更改对象以返回额外属性
  • 使用以下方式重新加载产品:

    foreach (Product product in context.Products)
    {
        context.Entry(product).Reload();
    }
    

但似乎没有任何工作,我还需要做些什么来重置上下文吗?

1 个答案:

答案 0 :(得分:0)

事实证明,它是变体实体的配置错误,而不是过滤后的上下文。我只使用VariantID作为Key,但由于存在多个具有相同ID的变体,因此它覆盖了以下变体,其值与第一个具有该ID的变量相同查询后回来的对象(看起来好像只有我过滤过的商店)。

我通过使密钥对商店和变体id唯一来解决这个问题:

HasKey(v => new {v.VariantId, c.StoreId});