【问题标题】:Entity Framework - Mixing model-first and database-first approaches?实体框架 - 混合模型优先和数据库优先方法?
【发布时间】:2011-02-28 22:36:56
【问题描述】:

对于我使用实体框架的第一个项目,我选择使用“模型优先”方法,在这种方法中我设计我的实体,从中创建脚本以生成所需的数据库表。这一直很有效,直到我遇到无法在单个查询中完全检索到我需要的所有数据元素的情况(我的 LINQ 技能仍然有限)。

因为我可以很容易地用 SQL 编写我需要的查询,所以我想知道是否可以为我的数据库编写一个视图,然后在我的模型中生成一个实体,换句话说,混合两个模型/数据库方法。对此有何想法?

【问题讨论】:

  • 并非开箱即用,但有第三方工具可让您混合使用两种模型。一个可以做到这一点的工具(选择性地进行个别更改)是我的插件中的 EFv4“模型比较器”,您可以在 huagati.com/dbmltools 下载并获得试用许可证。这篇博文更详细地描述了模型比较器(带有显示基本功能的截屏视频):huagati.blogspot.com/2010/07/…

标签: .net linq linq-to-sql entity-framework linq-to-entities


【解决方案1】:

您不能混合使用模型优先和数据库优先。手动修改数据库后,您将无法再使用从 EDMX 生成数据库,或者删除直接在 DB 中执行的更改。

在某些情况下,可以通过将 Entity Designer Database Generation Power Pack 扩展下载到 Visual Studio 2010 来避免这种情况。当将此扩展与 VS 2010 Premium 或 Ultimate 一起使用时,您可以使用额外的 DB 生成工作流和 T4 模板,它们能够使用 VS 工具来将新生成的数据库与现有数据库进行比较,并仅创建 ALTER 脚本。

但这仍然很可能不适用于 DB 视图,因为有关 DB 视图的信息存储在 SSDL(存储模型描述)中。模型优先不使用视图,每次重新生成数据库时它都会创建表而不是视图。

因此,如果您想运行任意 SQL 查询,请使用 ExecuteStoreQuery(仅限 EF4)或先放弃模型。

【讨论】:

  • 谢谢,看来使用带有自定义类的 ExecuteStoreQuery() 可以解决问题。
【解决方案2】:

你知道 SqlQuery() 方法吗?

ctx.Listings.SqlQuery("SQL Query Here", p1, p2...)

【讨论】:

  • 是的。它将运行一个自定义查询,为您的表(在我的情况下为 Listings 表)返回行,然后将它们映射到所有更改跟踪等打开的对象中。
  • 你有更详细的例子要展示吗?到目前为止,我还没有找到有关此 SqlQuery() 方法的任何信息。它属于什么命名空间?
  • 它是 DbSet 类的一部分。所以不需要命名空间或任何东西,它不是扩展方法。 http://blogs.msdn.com/b/adonet/archive/2010/12/06/ef-feature-ctp5-released.aspx
  • 其实我可能混淆了 Model First 和 Code First。对不起。此方法是 EF 的新 Code First CTP 位的一部分。
  • 普通EF中也有这种方法,不过叫ObjectContext.ExecuteStoreQuery
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多