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.RemoveCTP5 中关闭初始化器逻辑的等效项:在 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 在哪里?的主要内容,如果未能解决你的问题,请参考以下文章
EF CTP5 - 强类型急切加载 - 如何包含嵌套导航属性?