0

我首先使用带有代码的实体框架 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 所做的是将现有的表名更改为新的表名,而不是创建和使用新的表名。

谢谢!

4

1 回答 1

1

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

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

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

编辑:

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

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

如果您需要同时访问多个客户的数据,则必须通过 SQL 来完成。

于 2012-08-08T20:48:16.787 回答