【问题标题】:Insert/Update Many-to-many relationship with Entity Framework in disconnected enviroment在断开连接的环境中插入/更新与实体框架的多对多关系
【发布时间】:2015-08-18 09:29:34
【问题描述】:

我有一个调用 webApi 的 Web 应用,我的 webApi 调用我的服务,我的服务调用我的 DbContext。

我有 2 个实体,内容和文件。这些是单独的实体,存储在单独的表中。

现在我还有一个针对内容的集合,称为文件。这用于将文件引用到内容实体。

实体框架因此创建了名为 Content、File 和 ContentFile 的表。我对实体框架的配置是这样的

public ContentConfig() 
    : base()
{
    this.HasMany<File>(s => s.Files)
        .WithMany(c => c.Contents)
        .Map(e =>
        {
            e.MapLeftKey("ContentId");
            e.MapRightKey("FileId");
            e.ToTable("ContentFile");
        });
}

对于我的 webApi,我正在发送我的内容数据,看起来像这样

Id = 1,
Files = {
    { Id = 1, Name = "Test" }
}

这里我有一个 ID 为 1 的内容实体和一个 ID 为 1 的文件。我正在传递它,因为我希望实体框架在 2 个实体之间创建关系。

在我的服务中,我有这个代码。

public Task<int> AddOrUpdateAsync(Content content)
{
    // attach all files
    foreach (var file in content.Files)
        _context.Entry(file).State = EntityState.Modified;

    _context.Entry(content).State = EntityState.Modified;

    return _context.SaveChangesAsync();
}

所有这一切似乎都是更新我的内容实体并更新文件实体。没有插入关系?有人可以帮我插入关系吗?如果它已经存在于更新中会发生什么?实体框架会帮我解决这个问题吗?

当一切都断开时,似乎很难处理实体??还是这只是我?在我的单元测试中,这是可行的,但实体没有断开连接。

不确定它是否与它有关,但我正在使用 AutoMapper 从我的 webApi 模型创建我的实体。

【问题讨论】:

    标签: c# entity-framework asp.net-web-api entity-framework-6


    【解决方案1】:

    当您在不连接的情况下工作时,它可能是一种在您的业务方法(服务器端)中加载原始实体并使用连接的导航属性并稍后保存它们的解决方案。

    例如,以下代码显示了如何在断开连接的情况下保存包含子产品的类别:

    protected void UpdateCategoryWithProducts(Category entity)
    {
        /*--- Get Original Entity ---*/
        var originalMaster = this.GetQuery("Products").Where(x => x.CategoryId == entity.CategoryId).FirstOrDefault();
    
        /*--- Master ---*/
        this.Context.ChangeEntityStateToEdited(originalMaster, entity);
    
        if (entity.Products != null)
        {
            /*--- Get Lists ---*/
    
            var addedList = entity
                .Products
                .Where(y => y.ProductId == 0)
                .ToList();
    
            var deletedList = originalMaster
                .Products
                .Where
                (
                    x =>
                    (
                        !entity.Products
                        .Select(y => y.ProductId)
                        .Contains(x.ProductId)
                    )
                )
                .ToList();
    
            var editedList = entity.Products
             .Where
             (
                 y => originalMaster
                 .Products
                 .Select(z => z.ProductId)
                 .Contains(y.ProductId)
              )
              .ToList();
    
            /*--- Delete ---*/
            deletedList.ForEach(deletedProduct =>
            {
                originalMaster.Products.Remove(deletedProduct);
                this.Context.ChangeEntityStateToDeleted(deletedProduct);
            });
    
            /*--- Edit ---*/
            editedList.ForEach(editedProduct =>
            {
                var originalProduct = originalMaster.Products.Where(x => x.ProductId == editedProduct.ProductId).FirstOrDefault();
                this.Context.ChangeEntityStateToEdited(originalProduct, editedProduct);
            });
    
            /*---  Add ---*/
            addedList.ForEach(addedProduct =>
            {
                originalMaster.Products.Add(addedProduct);
            });
        }
    
        /*--- Save in context ---*/
        this.Context.Categories.Update(originalMaster);
        this.Context.SaveChanges();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多