【发布时间】:2015-11-22 21:00:36
【问题描述】:
我尝试在更新具有深厚关系的实体时找到问题的最佳解决方案。因为我的实体太复杂,关系更深,我简化成这个。
MainCategory - Category 是一对多的关系,Category - SubCategory 也是一对多的关系
public class MainCategory
{
[Key]
public int Id { get; set; }
public string MainCategoryName { get; set; }
public virtual ICollection<Category> Categories { get; set; }
}
public class Category
{
[Key]
public int Id { get; set; }
public string CategoryName { get; set; }
public virtual ICollection<SubCategory> SubCategories { get; set; }
}
public class SubCategory
{
[Key]
public int Id { get; set; }
public string SubCategoryName { get; set; }
public Category Category { get; set; }
}
这是我在更新或带有子孙记录的新 MainCategory 实体来自某个地方时处理这种情况的方法。
public void AddOrUpdateMainCategory()
{
using (var ctx = new MyContext())
{
// Gets MainCategory domain object.
// Domain object has no id property because it does not come from (ctx.MainCategories)
var mainCategory = GetMainCategory();
var mainCategoryFromDb = ctx.MainCategory.Include(x => x.Categories.Select(y => y.SubCategories)).FirstOrDefault(x => someCondition());
if (mainCategoryFromDb == null)
{
ctx.ShopParameterPeriodItems.Add(mainCategory);
}
// If mainCategoryFromDb is not null, mainCategory object should map to mainCategoryFromDb.
else
{
ctx.SubCategories.RemoveRange(mainCategoryFromDb.Categories.SelectMany(x => x.SubCategories));
ctx.Categories.RemoveRange(mainCategoryFromDb.Categories);
ctx.MainCategories.Remove(mainCategoryFromDb);
ctx.MainCategories.Add(mainCategory);
}
ctx.SaveChanges();
}
}
代码问题
- 由于更新机制是删除旧实体及其子实体和孙实体并添加新实体,因此每次都会刷新数据库记录的Id值。如果 MainCategory、Category 或 SubCategory 存在来自不同表的任何外键,这将是一个大问题。
-
第一个问题可以这样解决
foreach (var category in mainCategoryFromDb.Categories) { foreach (var subCategory in category.SubCategories) { // Set subCategory properties } // Set category properties } // Set mainCategoryFromDb properties这解决了 Id loss 问题,但正如我所写,实体非常复杂。这将很难维护,例如,我们不知道 mainCategory 的哪个类别会更新 mainCategoryFromDb 的类别,因为 mainCategory 及其子实体和孙子实体没有 Id属性。
我正在寻找的是解决问题的方法。
【问题讨论】:
标签: entity-framework entity-framework-5 entity-framework-6