[英]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.