多个数据库,单一视图

时间:2017-06-22 14:56:38

标签: c# sql-server asp.net-mvc .net-core

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

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

也许我在思考它,这应该是一项非常简单的任务(编辑:对于之前没有花时间跟踪MVC的人来说很容易)。我目前的状态:

为了简单起见,我暂时忽略了Active Directory。所以,我有两个控制器,两个视图,两个上下文和每个表的模型。他们分开工作。为简单起见,唯一的共同点是,可以使用相同的搜索字符串(员工的唯一标识符)搜索数据源。

ConnectionDatabase跟踪有关连接到我们使用的服务的计算机的信息,例如用户名,计算机名等。

InventoryDatabase是一个库存管理工具,是人类输入的数据。

此处的关键信息是,我只是试图在一个页面上显示来自这两个数据库的数据。我没有使用连接,我并没有尝试关联数据,也没有尝试将这些数据关联起来。基本上,如果我可以从Database1中获取View,从Database2中获取View,并使它们都显示在同一个视图中,坦率地说我只需要它。恰好出现在同一页面上的两个完全独立的实体。

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

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

InventoryDatabase
| - Table1
  |  - Serial Number
  |  - SSO

修改 创建控制器时,我理解将上下文发送给它,因此将其限制为单个上下文。 GetConnectionAssets函数完美地运行,因为它当然使用ConnectionContext AClient模型。

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

为了进一步解释这一点,这里是〜/ Lookup / 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

除非我希望它在一个浏览器窗口而不是两个。 :)

1 个答案:

答案 0 :(得分:2)

有两种方法可以解决这个问题:

  1. 使用视图模型。视图只能使用单个模型,因此最简单的解决方案是创建一个新类,其中包含您尝试使用的两个数据的数据。然后,您将此类传递给您的视图。

  2. 利用视图组件。从本质上讲,这些就像迷你行动。它们在自己的上下文中运行,因此您可以向不同的数据库发出单独的查询,返回不同的模型和部分视图等。然后,您只需调用主视图上的每个视图组件并让它们执行它们的操作。