2017-06-22 3 views
0

Ich versuche, ein einfaches Tool zu erstellen, das Daten aus zwei Datenbanken und Active Directory abruft. Das Problem, mit dem ich zu kämpfen habe, besteht darin, diese Daten einfach auf einer einzigen Seite zusammenzuführen.Mehrere Datenbanken, Einzelansicht

Ich habe versucht, jede Methode, die ich denken kann, um dies zu erreichen, aber letztlich, was kommt es darauf an, wie ich Daten von einem anderen Controller/Kontext/Modell bevölkern?

Vielleicht bin ich über denke, es sollte eine sehr einfache Aufgabe sein (bearbeiten: einfach für jemanden, der vorher nicht die Zeit genommen hat, MVC zu folgen). Mein aktueller Status:

Aus Gründen der Einfachheit werde ich Active Directory vorerst ignorieren. Also, ich habe zwei Controller, zwei Ansichten, zwei Kontexte und Modelle für jede Tabelle. Sie arbeiten separat gut. Der Einfachheit halber ist der einzige gemeinsame Nenner, dass beide Datenquellen mit dem gleichen Suchstring, einer eindeutigen Kennung eines Mitarbeiters, durchsucht werden können.

ConnectionDatabase Bahnen Informationen über Maschinen, die mit einem Service, den wir verwenden, wie Benutzername, Computername usw.

InventoryDatabase ist ein Inventar-Management-Tool, Humandaten eingegeben verbinden.

Die wichtigste Information hier ist an dieser Stelle Ich versuche einfach, Daten aus beiden dieser Datenbanken auf einer Seite anzuzeigen. Ich verwende keine Joins, ich versuche nicht, die Daten oder irgendetwas in dieser Richtung zu korrelieren. Im Wesentlichen, wenn ich einfach die Ansicht von Datenbank1 und die Ansicht von Datenbank2 nehmen könnte und sie beide in der gleichen Ansicht zeigen würde, die ehrlich gesagt alles ist, was ich brauche. Zwei völlig getrennte Entitäten, die zufällig auf derselben Seite erscheinen.

Eine Suchfunktion ermöglicht dem Benutzer die Suche nach einer einzelnen Anmeldenummer. Diese Nummer ist in beiden Datenbanken gespeichert und ich möchte, dass die Ergebnisse getrennt sind. Beispielsweise eine linke Spalte, die alle Datensätze aus ConnectionDatabase anzeigt, die SSO abgleichen, und eine rechte Spalte, die alle Datensätze aus InventoryDatabase zeigt, die SSO abgleicht.

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

InventoryDatabase 
| - Table1 
    | - Serial Number 
    | - SSO 

Edit: Wenn ein Controller erstellt wird es mein Verständnis ist ein Kontext, um es gesendet wird, damit es auf einen einzelnen Kontext zu begrenzen. Die Funktion GetConnectionAssets funktioniert perfekt, da sie natürlich das AClient-Modell ConnectionContext verwendet.

Jetzt möchte ich in InventoryDatabase werfen, die eigene InventoryDatabaseContext und InventoryDatabaseModel hat. Das Duplizieren von GetConnectionAssets und das einfache Verweisen auf InventoryDatabaseContext funktioniert nicht, da der gesamte Controller ConnectionContext zugewiesen ist.

In Anstrengung, dies weiter zu erläutern, hier ist mein Controller für ~/Nachschlagen/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)); 
     } 

} 
} 

Edit: Ich glaube, einen besseren Weg, dies ich ein Armaturenbrett bin Gebäude zu beschreiben. Stellen Sie sich also ein Vorfall-System-Dashboard vor, das auf einer einzelnen Seite Messwerte, derzeit geöffnete Tickets, Informationen zu Benutzern und einige Daten möglicherweise von einer externen Quelle anzeigt. Für den Code selbst können Daten völlig irrelevant sein.

Bearbeiten: Da es mir so schwer fällt, das zu erklären und mich selbst zu frustrieren, lass es mich in einem Bild zusammenfassen.Ich möchte, dass diese Seite genau so aussieht: http://imgur.com/a/tgZju

Außer ich möchte, dass es in einem Browserfenster statt zwei ist. :)

+0

Möchten Sie in SQL oder C# beitreten? Wenn C#, möchten Sie als Ergebnis eine neue Klassendefinition oder einen anonymen Typ erstellen? –

+0

Ich glaube nicht, dass ich suche, die Daten überhaupt beizutreten. Vorzugsweise wären die Ergebnisse ihre eigenen Entitäten. Ich glaube nicht, dass ich es richtig erklärt habe. Stellen Sie sich folgendes vor: ~/MyViewToIncludeEverything? SSO = # hat zwei Iframes, die nur auf ~/ConnectionDatabaseView zeigen? SSO = # und ~/InventoryDatabaseView? SSO = # - Obwohl das funktionieren würde, ist es eindeutig nicht der richtige Weg. – mrUlrik

Antwort

2

ist es zwei Möglichkeiten, wie Sie damit umgehen können:

  1. ein View-Modell verwenden. Eine Ansicht kann nur mit einem einzelnen Modell arbeiten. Daher ist es am einfachsten, eine neue Klasse zu erstellen, die die Daten für beide Dinge enthält, mit denen Sie arbeiten möchten. Dann übergeben Sie diese Klasse stattdessen Ihrer Ansicht.

  2. Verwenden Sie Ansichtskomponenten. Im Wesentlichen sind diese wie Mini-Aktionen. Sie arbeiten in ihrem eigenen Kontext, so dass Sie separate Abfragen an verschiedene Datenbanken ausgeben können, verschiedene Modelle und Teilansichten usw. zurückgeben können. Dann rufen Sie einfach jede Ansichtskomponente in Ihrer Hauptansicht auf und lassen sie ihre Sache machen.

+0

Okay, ich mag die Idee von Nummer 2. Es klingt genau nach dem, was ich suche. Aber es kommt auf genau das gleiche Problem an, das mir sagt, dass ich eine einfache Komponente für diesen Prozess nicht verstehe. In meinem Controller konnte ich eine ViewComponent aufrufen und diese an meine View übergeben. ViewComponent (, ). Die Daten für die Komponente sind das Problem. Ich weiß nicht, wie ich diese Daten aus einem völlig anderen Kontext herausholen soll. MVC scheint enorm linear zu sein, ohne gleichzeitig mit anderen Komponenten freundlich zu sein. – mrUlrik

+0

Sie können beliebig viele Kontexte in einem Controller verwenden. Du kannst sie einfach neu erfinden oder injizieren, so viele du willst. Ich verstehe nicht wirklich, was für ein spezifisches Problem Sie haben. –

+0

Ich bin ziemlich sicher, dass Sie diese Frage beantwortet haben, aber ich habe es nicht verstanden. Bei der Injektion bezogen Sie sich wahrscheinlich auf die Erweiterung des öffentlichen BySSOControllers (ConnectionContext-Kontext), um mehrere Kontexte einzubeziehen. Das wurde mir anderswo erklärt. Bitte vergib meine Unwissenheit, da ich ein einfacher Systemadministrator bin, der gerade versucht, ein sehr benötigtes Werkzeug zu erstellen! Vielen Dank, – mrUlrik