设置DbContext映射到的表

本文关键字:映射 DbContext 设置 | 更新日期: 2023-09-27 18:15:56

在我正在研究的一个应用程序中,我在数据库中有一堆查找表,它们都包含两件事:ID (int)和Value (string)。

只有少数,但我想把它们都映射到一个单独的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"),它会使用条形表,等等。

有什么办法可以做到吗?或者我必须为每个表创建一个单独的上下文+模型吗?

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

设置DbContext映射到的表

我们应该能够给你的答案是使用枚举,但这还不完全可用-它在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。希望这对你有帮助!

我实际上意识到我完全把事情复杂化了。没有理由存储两个列的多个表。

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

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

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

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