c# - Entity Framework 4.1。更新多对多关系。这是正确的方法吗?

标签 c# .net asp.net-mvc-3 entity-framework-4.1

下面的代码有效,但是,我怀疑我遗漏了什么。有“更好”的方法吗?

    private void UpdateNew(MarketProduct marketproduct)
    {
        context.MarketCategories.Load();
        MarketProduct dbProd = context.MarketProducts.Find(marketproduct.Id);
        dbProd.Categories.Clear();
        foreach (var c in marketproduct.Categories ?? Enumerable.Empty<MarketCategory>())
        {
            var cc = context.MarketCategories.Find(c.Id);
            dbProd.Categories.Add(cc);
        }
        context.Entry(dbProd).CurrentValues.SetValues(marketproduct);
    }

我认为不使用 Find 就可以做到这一点

最佳答案

您有三个数据库查询:1) context.MarketCategories.Load()(希望类别表很小,否则这将是不行的,因为它将整个表加载到内存中) , 2) ...Find 和 3) dbProd.Categories.Clear():这里肯定是涉及到了延迟加载,否则会崩溃,因为dbProd.类别 将为null

使用单个数据库查询更新的替代方法如下:

private void UpdateNew(MarketProduct marketproduct)
{
    MarketProduct dbProd = context.MarketProducts
        .Include(p => p.Categories)
        .Single(p => p.Id == marketproduct.Id);

    var categories = marketproduct.Categories 
                     ?? Enumerable.Empty<MarketCategory>();
    foreach (var category in categories)
    {
        if (!dbProd.Categories.Any(c => c.Id == category.Id))
        {
            // means: category is new
            context.MarketCategories.Attach(category);
            dbProd.Categories.Add(category);
        }
    }
    foreach (var category in dbProd.Categories.ToList())
    {
        if (!categories.Any(c => c.Id == category.Id))
            // means: category has been removed
            dbProd.Categories.Remove(category);
    }

    context.Entry(dbProd).CurrentValues.SetValues(marketproduct);

    // context.SaveChanges() somewhere
}

关于c# - Entity Framework 4.1。更新多对多关系。这是正确的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8417824/

相关文章:

c# - 初始化 Entity Framework 数据库时出错序列不包含匹配元素

c# - 如何导入 System.Net.Http.ObjectContent<object> 以便我可以将 HttpResponseMessage.Content 转换为它?

c# - 从 C# 终结器调用静态方法

c# - 如果验证方法应该返回验证结果,为什么会有 ArgumentException 类?

asp.net-mvc-3 - 如何在 ASP.NET MVC 3 解决方案中将 NServiceBus 与 NServiceBus.Ninject-CI 一起使用的示例

c# - Azure Functions 自定义日志记录的最佳实践是什么?

c# - C# 中的线程与定时器

asp.net - EF Core : A second operation started on this context before a previous operation completed 中的错误

c# - 通过 ActionFilter 检查 session 是否存在

jquery - MVC3 - 将 javascript 对象反序列化到 Controller