Entity framework 动态更改Fluent API映射

Entity framework 动态更改Fluent API映射,entity-framework,code-first,azure-sql-database,Entity Framework,Code First,Azure Sql Database,我们的项目首先使用实体框架代码。我们希望有一个实例,其中一个非常简单的POCO表示数据库中的许多表。它是SQLAzure中水平分区策略的一部分。SQLAzure不支持文件组,因此不支持典型分区。将有大量的表,因此通过基表上的检查约束将UNION ALL视图作为分区视图使用是不可行的 因此,我们希望在运行时根据需要生成映射。但是,这在DbContext类的OnModelCreating事件中通过以下代码发生 modelBuilder.Entity<EntityName>().ToTab

我们的项目首先使用实体框架代码。我们希望有一个实例,其中一个非常简单的POCO表示数据库中的许多表。它是SQLAzure中水平分区策略的一部分。SQLAzure不支持文件组,因此不支持典型分区。将有大量的表,因此通过基表上的检查约束将UNION ALL视图作为分区视图使用是不可行的

因此,我们希望在运行时根据需要生成映射。但是,这在DbContext类的OnModelCreating事件中通过以下代码发生

modelBuilder.Entity<EntityName>().ToTable("foo", "bar");
modelBuilder.Entity().ToTable(“foo”、“bar”);

。我们是否可以在工厂内执行此映射?我们更愿意向工厂提供元数据,然后让工厂使用Fluent API,而不是通过ModelBuilder在POCO和表之间进行一对一的映射。

您可以向您的
DbContext
衍生工具添加一个构造函数,其中包含两个表名和元模式名的字符串参数。您可以将名称存储在成员变量中,并在
ToTable
方法中使用它们

DbModel
是在实际需要时创建的,因此构造函数总是在
OnModelCreating
事件之前运行。(在派生类中并不总是这样,但这是一个不同的主题)


作为一种优化,您可以缓存已编译的
DbModel
s并通过构建
DbContext
s。

不清楚您需要什么。您可以在您的
OnModelCreating
中始终使用自定义代码创建映射。我不想在OnModelCreating中定义它。我希望有一个类,并且能够动态地将该类映射到具有相同模式的多个表。如果我在OnModelCreating中这样做,我相信我没有这个选择。使用OnModelCreating开箱即用使您映射到一个且仅映射到一个表。我喜欢这个想法。非常感谢。如果我想要多个实体的自定义映射,该怎么办?我想我可以传递一个字典来包含所有映射,使用EntityName作为键,TableName作为值。你的想法?当然,你可以这么做。或者
字典
使它更安全。很好!谢谢我会让这根线慢炖一下,看看会发生什么。我喜欢你的回答。