多个数据库,单个视图

多个数据库,单个视图

问题描述:

我正在尝试创建一个从两个数据库和Active Directory中提取数据的简单工具。我正在努力的问题是简单地将这些数据加入到一个页面中。多个数据库,单个视图

我一直在尝试,我能想到的做到这一点的任何方法,但最终它归结为是如何从另一个控制器/上下文/模型填充数据?

也许我思前想,这应该是一个非常简单的任务(编辑:易有人在此之前,没有采取遵循MVC的时候谁)。我现在的状态:

为了简单起见,我会忽略的Active Directory现在。所以,我有两个控制器,两个视图,两个上下文和每个表的模型。他们单独工作很好。为了简单起见,唯一的共同点是两个数据源都可以使用同一个搜索字符串进行搜索,这是一个员工的唯一标识符。

ConnectionDatabase跟踪有关连接到我们使用诸如用户名,计算机名等

InventoryDatabase是库存管理的工具,人类进入数据服务机的信息。

的关键信息在这里是在这一点上,我只是想在一个页面上这两个数据库的显示数据。我没有使用连接,我也没有尝试关联数据,或者按照这些关系。本质上,如果我可以只从数据库1查看数据库和从数据库2查看数据库,并使它们都显示在坦率地说我需要的全部视图中。两个完全分开的实体恰好出现在同一页面上。

搜索功能允许用户通过对号码的单个符号进行搜索。这个数字存储在两个数据库中,我希望结果是分开的。例如,左列显示来自ConnectionDatabase匹配SSO的所有记录,右列显示与InventoryDatabase匹配SSO的所有记录。

ConnectionDatabase 
| - Table1 
    | - ClientName 
    | - SSO 
    | - Other Info 

InventoryDatabase 
| - Table1 
    | - Serial Number 
    | - SSO 

编辑: 当控制器创建我的理解上下文发送给它的,因此限制了单个上下文。函数GetConnectionAssets完美工作,因为它使用ConnectionContext AClient模型。

现在,我想在InventoryDatabase它有它自己的InventoryDatabaseContext和InventoryDatabaseModel折腾。由于整个控制器专用于ConnectionContext,因此复制GetConnectionAssets并将其简单指向InventoryDatabaseContext不起作用。

在努力进一步解释这一点,这是我的控制器〜/查询/ BySSO:

namespace MyApp.Controllers 
{ 
    public class BySSOController : Controller 
    { 
     private readonly ConnectionContext _context; 

     public BySSOController(ConnectionContext context) 
     { 
      _context = context; 
     } 

     public ActionResult PartialView() 
     { 
      return View(); 
     } 

     public List<AClient> GetConnectionAssets(string SSO) 
     { 
      var aClients = from a in _context.AClient select a; 
      aClients = aClients.Include(a => a.AUserDefined) 
       .OrderByDescending(a => a.LastConnectDate); 
      if (!String.IsNullOrEmpty(SSO)) 
      { 
       aClients = aClients.Where(a =>  a.AUserDefined.Sso.Equals(SSO)) 
        .Include(a => a.AUserDefined); 
      } 
      return aClients.ToList(); 
     } 

     public PartialViewResult RenderAClients(string SSO) 
     { 
      return PartialView(GetConnectionAssets(SSO)); 
     } 

} 
} 

编辑: 我认为更好的方式来形容,这是我建立的仪表板。因此,想象一下,单个页面上的事件系统仪表板可以显示指标,当前打开的故障单,有关用户的信息以及可能来自外部来源的一些数据。对于代码本身来说,它可能是完全不相关的数据。

编辑:因为我很难解释这一点,让我感到沮丧,所以让我把它放在一张照片中。我想这个页面看起来就像这样: http://imgur.com/a/tgZju

除了我想它是在一个浏览器窗口,而不是两个。 :)

+0

想加入SQL还是C#?如果C#,你想创建一个新的类定义或匿名类型作为结果? –

+0

我不相信我想要加入数据。结果最好是他们自己的实体。我认为我没有正确解释。 ?想象一下〜/ MyViewToIncludeEverything SSO =#有两个I帧,仅仅指向〜/ ConnectionDatabaseView SSO =#和〜/ InventoryDatabaseView SSO =# - ?虽然这工作,它显然不这样做的正确方法。 – mrUlrik

有两种方法可以处理这个问题:

  1. 利用视图模型。一个视图只能用于一个模型,所以最简单的解决方案是创建一个新类,其中包含您正在尝试使用的所有内容的数据。然后,您将该类传递给您的视图。使用视图组件。基本上,这些就像迷你动作一样。它们在自己的上下文中运行,因此您可以向不同的数据库发出不同的查询,返回不同的模型和部分视图等。然后,您只需在主视图上调用每个视图组件,并让它们执行它们的操作。

+0

好的,我喜欢2号的想法。它听起来**正是**我在找什么。但是这涉及到完全相同的问题,它告诉我我不了解这个过程的一个简单组件。在我的控制器中,我可以调用ViewComponent并将其传递给我的视图。 ViewComponent(,)。提供组件的数据是问题。我不知道如何从完全不同的环境中获取这些数据。没有与其他组件友好相处的概念,MVC看起来是非常线性的。 – mrUlrik

+0

您可以在控制器中使用任何您喜欢的上下文。你只需将它们新建或注入,但无论你喜欢多少。我真的不明白你有什么具体问题。 –

+0

我相当肯定你回答了这个问题,但我不明白。通过注入,你可能指的是扩展公共BySSOController(ConnectionContext上下文)以包含多个上下文。这在其他地方已向我解释。请原谅我的无知,因为我是一个简单的系统管理员,只是试图创建一个非常需要的工具!谢谢, – mrUlrik