2016-08-15 2 views
2

coluld bitte seien Sie so freundlich, mir zu sagen, wie wähle ich DbSet abhängig von String-Variable? Was ich habe, ist folgendes:Wie verwendet man dynamisches DbSet in Entity Framework?

public class DataContext : DbContext 
{ 
    public DataContext() : base("myDb") { } 

    public DbSet<Entry> RurEntries { get; set; } 
    public DbSet<Entry> UsdEntries { get; set; } 
    public DbSet<Entry> EurEntries { get; set; } 
} 

Es gibt 3 Tabellen für jede Währung: Rur, Usd, Eur. Alle haben die gleiche Struktur. Es gibt eine String-Variable mit dem Namen CurrentCurrency, die von der Benutzeroberfläche geändert wurde und eine von drei Währungen sein kann. In meinem vorherigen Code ohne Entity Framework hatte ich Code, den db mit reinem SQL lesen, someting wie:

string sqlQuery = "Select * from " + CurrentCurrency 

Jetzt habe ich beschlossen Code mit Entity Framework neu zu schreiben und dieses Problem konfrontiert. Jede Antwort wird geschätzt. Danke im Voraus.

+3

Warum gehst du nicht einfach eine Flagge auf dem Tisch einführen anstatt drei Tabellen zu schaffen? – user3185569

+0

Was hast du schon versucht und gescheitert? –

+0

Alle 3 Tabellen haben das Feld unique_id, das ich von einer anderen Software erhalte. Ich habe ein eindeutiges Flag für diese Spalte verwendet und es könnte ein Problem sein, wenn ich alle Einträge in dieselbe Tabelle setze. – Smilley

Antwort

1

Sie nur eine Entität Klasse T in einem DbSet<T> einmal pro DbContext verwenden können . Ihr Code wird nicht ausgeführt. Siehe auch Entity Framework 6 Creating Two table from the same entity object.

Gegeben Ihr Kommentar:

Alle drei Tabellen haben unique_id Feld, das ich von einer anderen Software erhalten. Ich verwendete einzigartige Flagge auf dieser Spalte und es könnte ein Problem sein, wenn ich alle Einträge auf den gleichen Tisch

Sie haben soeben einen zusammengesetzten Primärschlüssel benötigen, bestehend aus Bargeld und ExternalId, wie erläutert in Composite Key with EF 4.1 Code First:

public class Entry 
{ 
    [Key] 
    [Column(Order = 0)] 
    public string Currency { get; set; } 

    [Key] 
    [Column(Order = 1)] 
    public string ExternalId { get; set; } 
} 

Dann können Sie die „EUR“ Zeilen wie folgt lauten:

var eurRows = dbContext.Entries.Where(e => e.Currency == "EUR"); 
+0

Danke. Das funktioniert gut. – Smilley

0

Sie können Raw-SQL-Abfragen in Entity Framework ausführen. Wie folgt aus:

var curs = context.Database.SqlQuery<Entry>("Select * from " + CurrentCurrency").ToList(); 

Sie können auch, dass mehr ordentlich machen und eine gespeicherte Prozedur erstellen, in dem Sie einen Parameter senden und führen eine SELECT Anweisung auf der Grundlage dieser Parameter. Dann rufen Sie mit Entity-Framework diese Prozedur auf und ordnen die Ergebnisse einer List<Entry> zu.

Allerdings, und wie ich in den Kommentaren sagte ich persönlich lieber nur eine Tabelle mit einer CurrenyCode Spalte haben. Anstatt 3 Tabellen mit der gleichen Struktur, aber mit unterschiedlichen Daten. Dann können Sie wie folgt abfragen:

var curs = var curs = context.Currencies.Where(x=> x.CurrencyCode = CurrentCurrency) 
             .ToList(); 
2

Sie einfach auf Ihre CurrentCurrency Zeichenfolge wechseln bekommen eingestellt, dass Sie benötigen:

var db = new DataContext(); 
     var CurrentCurrency = "RUR"; 
     DbSet<Entry> set = null; 
     switch (CurrentCurrency) { 
      case "RUR": 
       set = db.RurEntries; 
      break; 
      case "EUR": 
       set = db.EurEntries; 
      break; 
      case "USD": 
       set = db.UsdEntries; 
      break; 
      default: 
       throw new Exception(); 
     } 
     var res = set.ToList(); 
+0

Genau das, was ich brauchte. Vielen Dank. – Smilley

+0

Wie @CodeCaster schrieb, funktioniert das nicht, da ich nur eine Entity-Klasse T in einem DbSet einmal pro DbContext verwenden kann. Endlich musste ich Feldwährung in meine Klasse einführen. – Smilley

+0

@Smilley Ich denke, das sollte funktionieren, wenn Sie die Vererbung verwenden und Entry wäre nur eine abstrakte Basisklasse. Wie auch immer, die von CodeCaster vorgeschlagene Lösung scheint einfacher zu sein. – 3615

Verwandte Themen