簡體   English   中英

在斷開連接的環境中與實體框架插入/更新多對多關系

[英]Insert/Update Many-to-many relationship with Entity Framework in disconnected enviroment

我有一個Web應用程序,它調用一個webApi,我的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的文件實體。我正在傳遞它,因為我希望Entity Framework在兩個實體之間建立關系。

在我的服務中,我有此代碼。

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模型創建實體。

當您斷開連接時,將原始實體加載到業務方法(服務器端)中並使用已連接的導航屬性並在以后保存它們可能是一種解決方案。

例如,以下代碼顯示了在斷開連接的情況下如何使用子產品保存類別:

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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM