Entity Framework - 混合使用模型优先和数据库优先方法?

3
对于我的第一个使用Entity Framework的项目,我选择使用“模型优先”方法,即设计实体,然后创建一个脚本以生成所需的数据库表。这一方法一直运作得很好,直到我遇到了一个情况,在这种情况下,我无法在单个查询中检索到我需要的所有数据元素(我的LINQ技能仍然有限)。
由于我可以轻松地编写我需要的SQL查询,我想知道是否可以为我的数据库编写一个视图,然后从中生成一个实体,换句话说,混合两种模型/数据库方法。对此有何想法?

不是开箱即用的,但有第三方工具可以让您混合使用这两个模型。一个可以做到这一点(有选择地跨越单个更改)的工具是EFv4“模型比较器”,它在我的插件中,您可以在http://huagati.com/dbmltools/下载并获得试用许可证。这篇博客文章详细介绍了模型比较器(附带一个屏幕录像展示基本功能):http://huagati.blogspot.com/2010/07/introducing-model-comparer-for-entity.html - KristoferA
2个回答

1
你知道SqlQuery()方法吗?
ctx.Listings.SqlQuery("SQL Query Here", p1, p2...)

是的,它会运行一个自定义查询,返回您表格中的行(在我的情况下是Listings表),然后将它们映射到对象中,并打开所有更改跟踪等功能。 - Chris Sainty
你有更详细的示例展示吗?到目前为止,我还没有找到关于这个SqlQuery()方法的任何信息。它属于哪个命名空间? - PongGod
它是DbSet<TEntity>类的一部分。因此不需要命名空间或任何内容,它不是扩展方法。 [http://blogs.msdn.com/b/adonet/archive/2010/12/06/ef-feature-ctp5-released.aspx] - Chris Sainty
实际上,我可能混淆了Model First和Code First。抱歉。这种方法是EF的新Code First CTP位的一部分。 - Chris Sainty
这个方法在常规的EF中也存在,但它被称为 ObjectContext.ExecuteStoreQuery - Ladislav Mrnka

1

你不能混合使用模型优先和数据库优先。一旦你手动修改了数据库,你就不能再使用EDMX生成数据库,否则你会删除直接在数据库中执行的更改。

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

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

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


谢谢,看起来使用ExecuteStoreQuery()和自定义类对我来说是个好办法。 - PongGod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接