【问题标题】:Change Fluent API mapping dynamically动态更改 Fluent API 映射
【发布时间】:2012-03-18 22:15:24
【问题描述】:

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

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

之类的代码
modelBuilder.Entity<EntityName>().ToTable("foo", "bar");

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

【问题讨论】:

  • 不清楚你要求什么。您始终可以在 OnModelCreating 中使用自定义代码创建映射。
  • 我不想在 OnModelCreating 中定义它。我想要一个类,并且能够将该类动态映射到具有相同架构的多个表。如果我在 OnModelCreating 中这样做,我不相信我有这个选项。使用开箱即用的 OnModelCreating 可以映射到一个且只有一个表。

标签: entity-framework code-first azure-sql-database


【解决方案1】:

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

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

作为一种优化,您可以缓存已编译的DbModels 并通过the constructor accepting a DbCompiledModel 构建DbContexts。

【讨论】:

  • 我喜欢这个主意。谢谢你。如果我想为多个实体自定义映射怎么办?我想我可以通过 Dictionary 来包含所有映射,使用 EntityName 作为键,使用 TableName 作为值。你的想法?
  • 当然可以。或Dictionary&lt;type, string&gt; 使其更安全。
  • 不错!谢谢。我会让这个线程慢一点,看看会发生什么。我喜欢你的回答。
猜你喜欢
  • 2012-12-01
  • 2010-10-28
  • 2012-01-14
  • 2015-01-26
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多