Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 将多个表合并到自定义视图模型中_Entity Framework_Model View Controller_Theory - Fatal编程技术网

Entity framework 将多个表合并到自定义视图模型中

Entity framework 将多个表合并到自定义视图模型中,entity-framework,model-view-controller,theory,Entity Framework,Model View Controller,Theory,第一个帖子在这里。我对编程非常陌生,对MVC和实体框架也是全新的。我有一个问题,涉及到很多细节和我尝试过的很多尝试的代码,但在我放下所有这些之前,我想我应该问一个问题,看看我是否从正确的范式来处理这个问题 我正在做一个项目,我的团队正在用MVC web应用程序替换基于访问的桌面应用程序。我们有一个单亲表,它与多个其他表有一对多的关系,我们已经将该模式作为mdf文件拉入我们的项目中,到目前为止,我们正在尝试首先执行这个数据库 主表的主键是CustomerID。所有子表都将CustomerID作为外

第一个帖子在这里。我对编程非常陌生,对MVC和实体框架也是全新的。我有一个问题,涉及到很多细节和我尝试过的很多尝试的代码,但在我放下所有这些之前,我想我应该问一个问题,看看我是否从正确的范式来处理这个问题

我正在做一个项目,我的团队正在用MVC web应用程序替换基于访问的桌面应用程序。我们有一个单亲表,它与多个其他表有一对多的关系,我们已经将该模式作为mdf文件拉入我们的项目中,到目前为止,我们正在尝试首先执行这个数据库

主表的主键是CustomerID。所有子表都将CustomerID作为外键。应用程序需要做的是为单个CustomerID显示来自所有不同表的选定单元格的数据

我试图攻击的方式是,我创建了一个仅包含需要显示的列的模型类,然后在一个控制器中,我使用CustomerID上的一系列左外部联接查询数据库,并仅选择我想要的列,然后填充我在select子句中创建的自定义模型的单个实例。然后我将该模型传递给视图


基本问题,我知道,但这是最好的一般过程吗?或者我需要用不同的方式来思考这个问题吗?

我不确定这是否是最好的方法,但我最终创建了一个模型,其中包含了我需要从中提取数据的每个表的列表

所以 公共类主模型 { 公共列表名称{get;set;} 公开列表电子邮件{get;set;} 公共列表电话{get;set;} }

然后

public ActionResult Index(int id)
{
    MasterModel masterModel = new MasterModel();
    masterModel.Names = *query NamesTable where Names.id == id*
    masterModel.Emails = *query EmailsTable where Emails.id == id*
    masterModel.Phones = *query PhonesTable where Phones.id == id*

    return View(masterModel)
}
这样就把masterModel传递给index.cshtml,index.cshtml为_NamesPartial.cshtml、_emailsparial.cshtml和_Phones.cshtml提供了一个局部视图。每个部分都有一个IList类型的模型,等等

因此,这些部分中的每一部分都有如下代码

foreach (var item in Model)
{
    @Html.TextBox("FirstProp", item.FirstProp)
    @Html.TextBox("SecondProp", item.SecondProp)
}
这样我的所有数据都显示在一页上

所以这个问题已经解决了


但这确实给我留下了一个新问题,即如何使用相同的方法/模型,仅使用一个控制器和模型来写入多个数据库。

我不确定这是否是最好的方法,但我最终创建了一个模型,其中包含了我需要从中提取数据的每个表的列表

所以 公共类主模型 { 公共列表名称{get;set;} 公开列表电子邮件{get;set;} 公共列表电话{get;set;} }

然后

public ActionResult Index(int id)
{
    MasterModel masterModel = new MasterModel();
    masterModel.Names = *query NamesTable where Names.id == id*
    masterModel.Emails = *query EmailsTable where Emails.id == id*
    masterModel.Phones = *query PhonesTable where Phones.id == id*

    return View(masterModel)
}
这样就把masterModel传递给index.cshtml,index.cshtml为_NamesPartial.cshtml、_emailsparial.cshtml和_Phones.cshtml提供了一个局部视图。每个部分都有一个IList类型的模型,等等

因此,这些部分中的每一部分都有如下代码

foreach (var item in Model)
{
    @Html.TextBox("FirstProp", item.FirstProp)
    @Html.TextBox("SecondProp", item.SecondProp)
}
这样我的所有数据都显示在一页上

所以这个问题已经解决了


但这确实给我留下了一个新问题,即如何使用相同的方法/模型,仅使用一个控制器和模型写入多个数据库中的每一个。

对于显示视图来说,这听起来似乎是合理的。对于创建或更新视图,需要包含子集合的不同模型。如果您使用的是EF,您不需要连接-您可以使用include语法急切地获取所需内容:_context.Customers.include(c=>c.Invoices)、include(c=>c.Addresses)等。您可以使用Automapper之类的工具将实体数据移动到模型中。谢谢@Steve!我感谢你的快速评论。Include看起来会很有帮助,感谢您为create和view提供了不同的模型。虽然它通常不是最佳实践,但您可以将实体类和所有
Include
直接传递到您的视图。对于CRUD应用程序来说,它会很好地工作。听起来他好像是在从实体构建视图模型。这对于显示视图来说似乎是合理的。对于创建或更新视图,需要包含子集合的不同模型。如果您使用的是EF,您不需要连接-您可以使用include语法急切地获取所需内容:_context.Customers.include(c=>c.Invoices)、include(c=>c.Addresses)等。您可以使用Automapper之类的工具将实体数据移动到模型中。谢谢@Steve!我感谢你的快速评论。Include看起来会很有帮助,感谢您为create和view提供了不同的模型。虽然它通常不是最佳实践,但您可以将实体类和所有
Include
直接传递到您的视图。对于CRUD应用程序来说,它会很好地工作。听起来他好像是在从实体构建视图模型。