使用复杂的预生成数据处理View Models和DBContext

时间:2017-06-06 20:52:37

标签: c# asp.net-mvc model-view-controller entity-framework-core dbcontext

我认为这是最佳做法的问题。

在尝试学习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解决此问题的模式或最佳实践。

编辑:修改了示例代码,以说明子构造函数可能不仅仅具有默认值,并且可能需要分析父属性值以了解如何生成自己。

0 个答案:

没有答案