实体框架4代码首先,使用相同的模型到多个表?

时间:2012-08-08 15:47:23

标签: entity-framework-4

我首先使用Entity Framework 4代码。我有一个模型,我希望能够根据配置文件将此模型映射到数据库中的不同表。

示例模型:

 public class Statistic
{
    [Key]
    public int id { get; set; }
    public string jobName { get; set; }
    public DateTime date { get; set; }
    public int pages { get; set; }
}

每个客户都有一个配置文件,其中指定了应该使用的表名。因此,每个客户应该拥有自己的表(在同一个数据库中)与上面的模型。

我如何使用Entity Framework 4执行此操作?

我在DbContext中试过这个:

modelBuilder.Entity<Statistic>().ToTable(tabelName);

但是当我使用它时,EF所做的是将现有的表名更改为新的tableName,而不是创建和使用新的名称。

谢谢!

1 个答案:

答案 0 :(得分:1)

这是不可能的。每个映射集只能映射一个类(在常见情况下为每个上下文)。为什么?因为数据库的访问点是DbSet(或ObjectContext API中的ObjectSet),它只是以这种方式创建:

var set = dbContext.Set<Statistics>();

EF应该如何知道应该使用Statistics类的哪个映射?它必须知道使用哪个映射来查询正确的表并将更改保存到正确的表。您可能会认为它可以被定义为参数但是会将映射细节暴露在上层之外 - 这是不可取的。

编辑:

如果您的应用程序逻辑永远不需要访问多个客户的统计信息,则可以动态地为每个客户创建映射。你需要:

  • 创建DbModelBuilder的实例并定义映射(或填充Configurations) - 在此步骤中,您将提供当前客户的表名称
  • 调用Build方法获取DbModel实例
  • Compile实例上调用DbModel以获取DbCompiledModel实例
  • 在某处缓存已编译的模型。模型编译是一项昂贵的操作,您需要每个客户只执行一次(并且每次重启应用程序)。
  • 将已编译的模型传递给DbContext构造函数,并使用该上下文实例仅访问该客户的数据

如果您需要同时访问多个客户的数据,则必须通过SQL执行此操作。