我有一个表格,它在实体的整个应用程序中使用。我有一个返回相同列集的视图,但实际上它本身是一个联合,以尝试解决一些不好的规范化(该应用程序很大并且部分不在我的手中,这部分是不可避免的)。
是否可以让实体 4 将与表完全相同的视图视为相同类型,以便我可以使用此视图来填充相同类型的集合?这个问题似乎表明它在 nhibernatem 中是可能的,但我找不到任何类似的实体。导航属性的额外好处仍然可以用于 Include(),但这不是必需的(我总是可以手动加入)。
我有一个表格,它在实体的整个应用程序中使用。我有一个返回相同列集的视图,但实际上它本身是一个联合,以尝试解决一些不好的规范化(该应用程序很大并且部分不在我的手中,这部分是不可避免的)。
是否可以让实体 4 将与表完全相同的视图视为相同类型,以便我可以使用此视图来填充相同类型的集合?这个问题似乎表明它在 nhibernatem 中是可能的,但我找不到任何类似的实体。导航属性的额外好处仍然可以用于 Include(),但这不是必需的(我总是可以手动加入)。
由于 EF 处理从对象到数据库实体的映射,因此这不可能直接实现。您需要的是动态更改查询的数据库实体之类的东西,而 AFAIK 如果不手动更改对象上下文是不可能的。
只要 EF 运行时可以将视图视为完全独立的表,它肯定不会在意。我预见到的两个可能的挑战是:
工具:我们的向导允许您在进行逆向工程时选择视图(即数据库优先)。明确地说,如果您可以对现有数据库使用“代码优先”,您可以假装视图只是一个表,但您不会获得任何帮助编写数据库创建或迁移脚本的帮助。
更新:通常,您可以为设置存储过程映射的视图执行更新(可在 v1 的 EF 设计器中或从 EF6 开始的 Code First 中使用)。您也许还可以直接更新您的视图或使用关闭触发器来代替(请参阅此处的“可更新视图”了解更多详细信息)。如果我没记错的话,EF 生成的用于检索数据库生成的值(例如,用于标识列)的 SQL 在某些情况下与相反的触发器不兼容。另一种选择是让您的应用程序将视图视为只读并通过实际表执行所有更新,您将映射为单独的实体。请记住,视图和原始表的内存中实体不会保持同步。
希望这可以帮助!