我认为这是最佳做法的问题。
在尝试学习MVC时,我发现自己正在为EF Core中的特定实体进行创建操作。我试图保持模型没有行为,因为这似乎是最佳实践 - 将模型的所有行为放入其Controller中,让模型只处理数据。
在大多数情况下,这非常简单直观。但是,我现在正在开发一个不寻常的实体:它在第一次创建时会生成大量的子数据。以下是我到目前为止的工作正常:
(对于上下文,这是程序游戏数据生成器的一部分。顶级实体是一个站点,它有多个位置,每个位置都有多个区域。创建站点时,我想生成子站点我编码的随机表。)
[HttpPost]
public IActionResult Create(Site site)
{
// get id values for child creation,
// since they won't get auto-assigned until SaveChanges()
int nextsiteid = _context.Sites.Count() + 1;
int maxlocationid = _context.Locations.Count();
// add site
_context.Sites.Add(site);
// add location children
for (int il = 0; il < site.LocationCount; il++)
{
int nextlocationid = maxlocationid + il + 1;
// constructor gets some site properties which influence
// random values
Location l = new Location(nextsiteid, site.Region, site.Faction);
_context.Locations.Add(l);
// add area grand-children
for (int ia = 0; ia < l.AreaCount; ia++)
{
Area a = new Area(nextlocationid, site.Region, site.Faction, l.Terrain);
_context.Areas.Add(a);
}
}
_context.SaveChanges();
return RedirectToAction("Details", new { site.Id });
}
控制器创建动作已经变得非常复杂,而且我还没有完成生成孩子的工作。除了区域,每个位置还需要一个子过渡列表,每个子过渡都有更多的子实体。此外,每个区域将有多个孩子(陷阱,诡计,怪物,宝藏)。
所以我的问题是,在什么时候控制器需要处理的数据太多?在某些时候将DbContext传递给Model上的方法并让模型处理自己的子创建是否有意义?在首次创建Site时,添加我想要的所有子事务将会产生一个难以理解的密集的循环,并且感觉它违反了OOP的一些基本组织原则。所以我很好奇是否有针对MVC解决此问题的模式或最佳实践。
编辑:修改了示例代码,以说明子构造函数可能不仅仅具有默认值,并且可能需要分析父属性值以了解如何生成自己。