Ich mache eine Intranet-Website mit ASP.NET MVC und SQL Server 2012. Ich mache ein Repository und Architektur mit Zwiebel-Architektur. Mein Problem ist, dass die Firma, in der ich arbeite, bereits mehrere Server-DBs hat, in denen die Tabellen keine Beziehungen zueinander haben. Stattdessen gibt es Tabellen, um diese Beziehungen abzubilden. Beispielsweise haben eine Tabelle Benutzer und eine Tabelle Dokument eine Tabelle User_joint_Document, um eine Beziehung herzustellen, die beide IDs (IDDocument und IDUser) enthält. Nun, wenn ich meine generische Repository schreiben:Entity Framework und Repository Pattern konzeptionelle Schwierigkeiten
class Repository<T> : IRepository<T> where T : class
das Problem ist der generische Typ T keinen Sinn macht, und ich kann nicht Wert in meinem Modell beeinflusst EF-Abfragen mit was normal ist und was wäre toll wäre, eine Elternklasse BaseEntity haben IDs für jede Tabellen definiert haben, dann kann ich schreiben:
class Repository<T> : IRepository<T> where T : BaseEntity
Und alle meine Tischmodelle von BaseEntity erben würde. Das würde aber auch bedeuten, die gesamte DB relational zu schreiben und jedes DB-POCO manuell zuzuordnen (korrigiere mich, wenn ich falsch liege), und ich habe nicht die nötigen Fähigkeiten (es gibt über 300 Tabellen in den verschiedenen Server-DBs) und mir fehlt das richtige Wissen und Erfahrung, um diese Art von Operation zu machen).
Gibt es eine Möglichkeit, meine ursprüngliche DB-Struktur zu behalten und trotzdem ein generisches Repository zu schreiben? Wie würde man das machen?
BEARBEITEN Um meine Frage zu klären, weil @saeb teilweise auf meine Frage antwortete. Kann ich einen generischen Repo haben, ohne eine Elternklasse für meine DB POCOs zu haben? Oder brauche ich es, um dann nur noch ein Repository zu haben, um alle zu beherrschen? Zum Beispiel:
class Repository<T>:IRepository<T> where T : class
{
private readonly ApplicationContext context;
private DbSet<T> entities;
public Repository(PrincipalServerContext context)
{
this.context = context;
entities = context.Set<T>();
}
public T Get(long id)
{
return entities.SingleOrDefault(s => s.IDUser == id);
//This does not work, IDUser isn't recognized
}
Vielen Dank für Ihre Hilfe!
Das Beispiel, das Sie von 'Benutzer' gegeben haben und 'Dateien' korrekt in der Datenbank. Ein Benutzer kann viele Dokumente haben, so dass Sie eine Junction-Tabelle von 'User_joint_Document' benötigen. So sollte eine relationale Datenbank strukturiert sein. – melkisadek
Aber wenn Sie Onion Architecture verwenden, gibt es ein Paket, das automatisch Repositories für Sie erstellt, Sie müssen sie nur in DataOnion registrieren. –
@melkisadek Bah! So schlecht arbeite ich an DBs. Ich hätte gedacht, du hättest zwischen den beiden Tischen so etwas wie eine 1-1-Beziehung oder so etwas? Vielleicht ist das Rel'ship ein echter Tisch? Wirklich nicht meine starke Seite. Wenn ich eine Elternklasse mit IDs erstelle, was wird dann diese Relationstabelle? Da es IDDocument und IDUser hatte, aber jetzt würde ich ID nur von der Elternklasse haben –