将遗留专有Web应用程序重写为MVC3/Entity-Code-First

Moo*_*ice 7 c# asp.net asp.net-mvc entity-framework ef-code-first

几个月来,我发布了一些关于ASP.NET应用程序和数据库抽象层结构的问题,以便重写(从头开始)一个遗留的Web应用程序.我最近偶然发现了MVC3/Entity-Code-First,花了一些时间,它已经爱上了它的工作方式,如何抽象出来,我正在寻找任何借口来使用它!

遗留应用程序是一个C++/CLI窗口服务,它生成它自己的HTML(非常老派的HTML,其中CSS只用于颜色和表格比比皆是),并且界面与业务逻辑紧密耦合.基本上,任何事情都会有所改善.

然而,也许这是因为我还没有花足够的时间与MVC,我有一些唠叨的疑虑,并想知道你们中的一些MVC-Pros是否可以在我的方向上挥发他们的经验.

  • 遗留应用程序使用自定义控件(它们自己的形式)将组合框绑定到数据,并根据另一个组合框中的选择动态重新填充相关组合框.在ASP.NET中,这个问题很容易回答,因为只需asp:DataList在页面上抛出控件,将其绑定到数据源即可.一些简单的代码允许您过滤所选值上的其他组合框.在ASP.NET中,实现另一个数据列表也很容易,甚至以这种方式自动化依赖数据(这将很好地模仿遗留应用程序的行为).我似乎无法在MVC中找到自定义控件的概念,尽管我认为这种东西是由jQuery调用处理来获取数据并将其放入组合框中.但是每个包含一个组合框的每个组合框都能完成吗?这是一个部分视图的情况,传递适当的参数,或者这只是愚蠢的?

  • 我想这更多地涉及实体框架比MVC,但大部分我在网上找到的例子和教程,执行LINQ查询返回对象的集合来显示,比如这个,从MvcMovie例如:

    public ActionResult Index()
    {
        var movies = from m in db.Movies
                     where m.ReleaseDate > new DateTime(1984, 6, 1)
                     select m;
    
        return View(movies.ToList());
    }
    
    Run Code Online (Sandbox Code Playgroud)

    然后使用@foreach视图中的循环进行渲染.这一切都很棒.遗留应用程序有一个浏览页面,供系统的所有其他区域使用(超过50个).它通过检查为登录的用户定义的列顺序来执行此操作,展平任何外键(以便显示外部表上的字段而不是非用户友好的主键值)并允许用户应用自定义过滤器到任何列.它也适用于行数超过100k的表.如何使用Entity-framework和views编写类似内容?在ASP.NET中,我可能通过动态生成某种网格视图并让它自动生成列并应用过滤器来解决这个问题.这似乎可能是我在MVC中的更多工作.我错过了什么?

  • 遗留应用程序具有多个操作大型数据集的操作.现在因为它是一项服务,它可以启动这些线程而不必担心被关闭.我在SO上的一个问题是关于静态管理器的存在以及AppPool回收的引入,但我已经决定使用辅助服务是一个不错的选择.也就是说,遗留应用程序将更新语句应用于大型记录组而不是单行.如果没有为绕过正常模型的数据库编写自定义SQL,这是否可以使用Entity-Framework?我希望我不必做这样的事情(不是我想,这只是例如)

    var records = from rec in myTable
                  where someField = someValue
                  select rec;
    foreach(rec in records)
        rec.applyCalculation();
    db.SaveDbChanges();
    
    Run Code Online (Sandbox Code Playgroud)

    我怀疑这可能需要花费很多时间,而遗留应用程序只会:

    UPDATE myTable
    SET field1 = calc
    WHERE someField = someValue
    
    Run Code Online (Sandbox Code Playgroud)

    因此,我并不完全清楚我们如何以这种方式使用我们的模型.

  • 遗留应用程序在布局中有一些数据面板,可以随身携带任何页面.看看Stackoverflow,我发现了这个问题,这意味着每个视图都需要将这些信息传递给布局?是这样,还是有更好的方法?理想情况下,我希望我的布局能够访问特定的模型/存储库并在侧面板中显示数据.添加到每个视图页面可能非常重复并且容易出错.更不用说如果我需要修改某些东西需要的时间.部分视图会在这里完成,但我再次不确定如何在布局页面上将模型传递给它.

  • 最后,在安装Ef-Code-First之后,我很失望地发现一个非常好的属性,SourceName还没有进入.这对于遗留表/列的映射非常好,我不完全确定为什么它在这一点上被遗漏了(至少,我的intellisense说它不存在!)有没有人知道这可能会发生什么?我可以在没有它的情况下做一段时间,但最终它会非常有用.

对不起,这是一个很长的问题.经过ASP.NET和MVC3的多年调查工作,我真的很想使用MVC3!

mar*_*are 3

如果我能够正确提取问题,那么这将是我的答复:

  1. 您对主 - 详细信息下拉菜单(或其他控件)的思考是正确的。jQuery AJAX/JSON 调用(主要是 GET)将是您所需要的。如果您的页面上只有一个下拉菜单,那么您当然不需要这种交互性 - 您只需在控制器操作中为其准备模型(创建一个 SelectList 对象)。

  2. 在这里,您很可能最终会使用某种网格系统,例如 jqGrid 或 Flexigrid。他们自己完成了大部分有关过滤/搜索/查询的工作。不过,您仍然必须提供将提供数据的 JSON 控制器操作。

  3. 是的,您可以通过 EF 执行 SQL。有ExecuteStoreQuery()ExecuteStoreCommand()。以下是有关这些内容的更多信息:http://msdn.microsoft.com/en-us/library/ee358769.aspx

  4. 您可以从视图中调用RenderAction(),并让此操作按需准备数据(无论何时调用)并渲染出部分(或普通)视图并向其提供数据(模型)。RenderPartial()这样做有点笨拙 - 它要求您在调用的视图中已有可用的模型RenderPartial()RenderPartial()永远不会返回到控制器操作 - 它只是使用您在视图中的调用中提供的模型渲染模板中定义的 HTML。

  5. 不幸的是我不知道这个问题的答案。

华泰