设置DbContext映射到的表

时间:2011-11-29 01:14:54

标签: c# entity-framework

在我正在处理的应用程序中,我在数据库中实际上有一堆查找表,它们都包含两个内容:ID(int)和Value(字符串) 。

只有少数几个,但我想将它们全部映射到一个Context,这取决于表名。类似的东西:

class LookupContext : DbContext
{
    public DbSet<Lookup> Lookups { get; set; }

    public LookupContext(String table)
    {
        // Pseudo code:
        // Bind Lookups based on what table is
        Lookups = MyDatabase.BindTo(table);
    }
}

因此,如果我创建一个new LookupContext("foo"),它会绑定foo表。如果我new LookupContext("bar")它使用条形表,依此类推。

有没有办法做到这一点?或者我是否必须为每个表创建一个单独的上下文+模型?

这或多或少是我第一次这样做,所以我不确定我做的是否正确。

2 个答案:

答案 0 :(得分:0)

我们 能给你的答案是使用枚举,但目前还没有 - 它是在EF的下一个版本中。有关详细信息,请参阅此处:http://blogs.msdn.com/b/adonet/archive/2011/06/30/walkthrough-enums-june-ctp.aspx

使用早期版本的EF,您可以简单地为每个查找值创建一个类(假设以状态为例),并且代码类似于以下内容:

public class State
{
  public int StateId {get;set;}
  public string StateName {get;set;}
}

public class LookupContext : DbContext
{
  public DbSet<State> States {get;set;}
  // ... more lookups as DbSets
}

这将允许您使用一个上下文,但仍然需要每个表一个类。如果希望表/列名分别与类/属性名不同,也可以使用fluent API。希望有所帮助!

答案 1 :(得分:0)

我实际上意识到我完全超越了理性之外的事情。没有理由存储有两列的多个表。

我最好将我的数据存储为:

public class LookupValue
{
    public string LookupValueId { get; set; }
    public string Value { get; set; }
    public string LookupType { get; set; }
}

第三个字段只是我之前存储在数据库中的表的名称。

我仍然对将单个Context类映射到多个表的想法感兴趣,但我相信我上面描述的是完成我需要的最不复杂的方法。