2016-08-15 77 views
2

coluld请你好好告诉我如何根据字符串变量选择DbSet?我有以下几种:如何在实体框架中使用动态DbSet?

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; } 
} 

每种货币有3张表:Rur,Usd,Eur。全部具有相同的结构。 有一个名为CurrentCurrency的字符串变量,它从UI更改并可能是3种货币之一。在我以前没有实体框架的代码,我有这样的纯SQL,像成才阅读DB代码:

string sqlQuery = "Select * from " + CurrentCurrency 

现在我决定与实体框架重写代码,面临这个问题。任何答案将不胜感激。提前致谢。

+3

你为什么不只是介绍一个标志表中,而不是创建三个表? – user3185569

+0

你已经尝试和失败了什么? –

+0

所有3个表都有unique_id字段,我从另一个软件收到。我在该列上使用了唯一标志,如果我将所有条目都放到同一个表中,可能会出现问题 – Smilley

回答

1

只能在一次每次的DbContext一个DbSet<T>使用实体类T 。你的代码不会运行。另见Entity Framework 6 Creating Two table from the same entity object

鉴于您的评论:

所有3个表具有UNIQUE_ID场,这是我从另一个软件接收。我用的是列中的唯一标志,如果我把所有的条目到同一个表它可能是一个问题

你只需要一个复合主键,包括货币和外部ID,如在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; } 
} 

然后,你可以这样写的“欧元”行:

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

谢谢。这工作正常。 – Smilley

0

您可以在实体框架中执行原始SQL查询。就像这样:

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

您也可以让更多的整洁,创建一个存储过程,您发送的参数,并执行基于该参数的SELECT声明。然后使用实体框架,您可以调用该过程将结果映射到List<Entry>

但是,正如我在评论中指出的那样,我个人更喜欢只有一个带有CurrenyCode列的表格。而不是具有完全相同结构但具有不同数据的3个表格。然后你就可以查询这样的:

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

您可以在CurrentCurrency串简单地切换才能完成设置,您需要:

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

正是我所需要的。谢谢。 – Smilley

+0

由于@CodeCaster写道不起作用,因为我只能在DbSet 中针对每个DbContext使用一个实体类T.最后不得不将字段货币介绍给我的班级。 – Smilley

+0

@Smilley我认为这应该工作,如果你使用继承和条目将只是一个抽象的基类。无论如何,CodeCaster建议的解决方案似乎更直接。 – 3615