EF CTP5 中的modelBuilder.IncludeMetadataInDatabase 在哪里?

Posted

技术标签:

【中文标题】EF CTP5 中的modelBuilder.IncludeMetadataInDatabase 在哪里?【英文标题】:Where is modelBuilder.IncludeMetadataInDatabase in EF CTP5? 【发布时间】:2010-12-19 19:01:36 【问题描述】:

使用 CTP4,我曾经能够执行以下操作(如 suggested by ptrandem):

modelBuilder.IncludeMetadataInDatabase = false

使用这行代码,EF 不会在我的数据库中创建 EdmMetadata 表,也不会跟踪模型更改。

我无法在新的 CTP5 中找到实现这一点的方法,所以现在每次我更改模型时,都会得到以下信息:

支持“MyContext”的模型 自数据库以来上下文已更改 被创建。要么手动 删除/更新数据库,或调用 Database.SetInitializer 与 IDatabaseInitializer 实例。为了 例如, DropCreateDatabaseIfModelChanges 策略将自动删除并 重新创建数据库,并且可以选择 用新数据播种它。

那么,大家知道 CTP5 中的 IncludeMetadataInDatabase 属性在哪里吗?谢谢。

【问题讨论】:

【参考方案1】:

CTP5 包含一个非常酷的功能,称为Pluggable Conventions,可用于添加/删除约定。 IncludeMetadataInDatabase 已被删除并被替换为 为您做同样事情的可插拔约定:

modelBuilder.Conventions
            .Remove<System.Data.Entity.Database.IncludeMetadataConvention>();

【讨论】:

谢谢,莫特萨。您知道这样做与仅删除 EdmMetadata 表(如 ADO.NET 团队博客所述)之间是否还有其他区别?什么是可取的? 没问题。我认为您在团队博客上找到的内容是关于现有数据库的,而我建议的内容是针对您从对象模型生成数据库时的内容。归根结底,它们都有相同的结果:您有一个 POCO 对象模型,它可以与没有元数据表的数据库一起使用,所以我认为这取决于您的场景(全新的数据库或现有的数据库)。 在最新版本中,这已移至 modelBuilder.Conventions.Remove();【参考方案2】:

CTP5 中关闭初始化器逻辑的等效项:在 Global.asax 的 Application_Start 中,输入以下内容:

System.Data.Entity.Database.DbDatabase.SetInitializer<MyDBContext>(null);

【讨论】:

【参考方案3】:

在 EF 4.1 中

protected override void OnModelCreating(DbModelBuilder modelBuilder)

    modelBuilder.Conventions.Remove<IncludeMetadataConvention>();

【讨论】:

【参考方案4】:

一直在寻找这个问题,我必须在发布我的问题后立即找到答案,DUH。直接来自ADO.NET team blog:

在 CTP5 中,我们不再需要 执行附加配置时 映射到现有数据库。如果 Code First 检测到它正在指向 到现有的数据库模式,它 没有创造,那么它将“信任” 你'并尝试先使用代码 与架构。最简单的方法 将 Code First 指向现有的 数据库是添加一个App/Web.config 同名连接字符串 作为您的派生 DbContext (...)

【讨论】:

以上是关于EF CTP5 中的modelBuilder.IncludeMetadataInDatabase 在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

EF4 CTP5 代码优先实现中的实体拆分场景

EF CTP5 - 强类型急切加载 - 如何包含嵌套导航属性?

首先关闭 EF 代码的 CTP5 的 ProxyCreationEnabled 有啥缺点

EF4 CTP5 Code First 方法忽略表属性

EF 代码优先 CTP5。如何存储来自基类的继承数据

EF4 CTP5 - 映射没有对象引用的外键?