2012-04-19 39 views
2

我有一个表格,它可以被整个应用程序使用。我有一个观点,返回一个相同的列集,但实际上是一个联盟,试图解决一些不好的规范化(应用程序很大,部分不在我的手中,这部分是不可避免的)。使用与表格相同的类型查看

是否有可能有实体4请客一种观点认为是完全一样的表为同一类型,这样我可以用这个观点来填充相同类型的集合? This question似乎表明它可能在nhibernatem中,但我无法找到任何类似实体的东西。这将是导航属性仍然​​可以用于Include()的额外奖励,但这不是必需的(我总是可以手动加入)。

+0

这是不可能的。您应该映射到另一种类型并进行内部复制 - 例如与Automapper - 用于保存更改。顺便说一下,我认为NHibernate链接告诉我们同样的道理。这将是一个不错的主意,只有一种类型具有不同的读取和保存路径。 – 2012-04-20 11:36:49

回答

0

由于EF适用于从对象到数据库实体的映射,这是不能直接成为可能。你需要的是像动态改变被查询的数据库实体,AFAIK这是不可能的,不需要手动改变对象上下文。

0

可以肯定的EF运行时就不会,只要它可以治疗的观点,如果它是完全独立的表关心。我预见了两种可能的挑战是:

  1. 工具:我们的向导不会允许你做逆向工程(即数据库优先)时选择的看法。明确地说,如果您可以使用'先针对现有数据库'的代码,那么您可以假装该视图只是一个表格,但您不会为创建或迁移数据库创建任何脚本。

  2. 更新:一般来说,你可以为一个视图设置存储过程映射(它可在EF设计从V1或代码第一次在EF6开始)进行更新。您也可以直接使用视图更新或使用关闭触发器(有关更多详细信息,请参阅“可更新视图”here)。如果我没有记错,由EF生成的用于检索数据库生成值(例如,用于标识列)的SQL在某些情况下与取消关闭触发器不兼容。还有一种选择是让你的应用程序将视图视为只读,并通过实际的表格执行所有的更新,你将把它作为一个单独的实体映射。请记住,视图的内存实体和原始表不会保持同步。

希望这有助于!

+0

我知道我的答案有点不完整,因为我不记得所有可能出错的细节,但我打算跟进这些细节。只是尽可能快地提供一些有用的信息。 – divega 2013-08-16 20:08:51

+0

更新了附加信息。我最初错过了提及您可以使用存储过程更新视图。 – divega 2013-08-17 18:29:27

相关问题