gpt4 book ai didi

wcf - Entity Framework - 架构升级、多个 DBMS 和代码优先

转载 作者:行者123 更新时间:2023-12-04 06:30:00 25 4
gpt4 key购买 nike

我正在考虑在即将发布的项目中使用 Microsoft 的 Entity Framework ,该项目是现有产品的单点发布。我们当前的产品支持两个 DBMS(Oracle 和 SQL Server),每个的架构都在单独的 .sql 脚本文件中维护。

Entity Framework (4.1) 看起来很吸引人,因为它允许通过代码生成、反射等自动实现各种场景。但是,据我所知,其中一些好处似乎是相互排斥的。

例如,为了支持多个 DMBS,我推断我需要使用模型或代码优先设计,在这种情况下,EF 将根据模型为每个生成模式(我几乎没有看到关于此的帖子或文档) ,所以我可能是错的)。这意味着我们现有的模式需要被放弃(模型优先)或映射(代码优先)。此外,更新架构将需要手动脚本,因为 EF 似乎不支持架构升级(不清除数据)。

  • 模型优先和代码优先是在 EF 中支持多个 DBMS 的唯一可行方法吗?我意识到从技术上讲不可能保证两个任意模式相同,所以我认为这是真的。
  • 代码优先和映射到多个 DBMS 系统是否有任何潜在的陷阱?例如,Oracle 没有自增列;你必须使用序列。这是如何在 DbContext 中映射的?我是否需要为每个 DBMS 创建单独的映射?
  • EF 是否支持将现有 DBMS 架构升级到其中一个代表 EF 模型的机制(架构重新创建 =/= 升级),或者我是否仅限于手动执行此操作?
  • 我确实想出了一种首先使用数据库并支持多个 DBMS 的可能方法,但这是一个维护噩梦。这个想法是为两个生成的数据模型添加另一个抽象层,并为每个 EF 生成的模型创建转换器类。这似乎是最好的方法,这样每个 DBMS 都可能拥有自己的模型,而我的代码将处理映射。但是这样做,我从 EF 中真正获得了什么?也许查询生成,但这值得吗?
  • 最佳答案

    实际上,模型优先和数据库优先都具有相同的约束。这两种方法都使用一个 EDMX 文件,该文件包含与单个数据库提供程序直接相关的 SSDL(存储描述 = 数据库层)部分,因此如果您想拥有两个不同的数据库提供程序,您必须拥有两个不同的 SSDL 部分并将它们保存在同步。您可以使用单个 CSDL(概念层的描述 = 您的模型类)和单个或两个 MSL(SSDL 和 CSDL 之间映射的描述 - 仅当表和列在两个 SSDL 中具有完全相同的名称时才可能使用单个文件)。据我所知,EDMX 文件只能由单个 SSDL、CSDL 和 MSL 部分组成,因此我希望设计人员不支持这种情况,您将不得不手动修改第二个 SSDL 或使用两个 EDMX = 模型每次更改两次。

    代码优先的方法可以使这更简单,但问题是在使用代码优先和数据库生成时,Oracle 提供程序有多好。在自动增量列的情况下,提供程序负责正确解释所需的功能,如序列。

    EF 本身目前不支持升级现有数据库。使用 EDMX 时,数据库生成过程由 T4 模板或工作流控制,因此可以进行自定义,并且已经有单独的功能称为 Entity Designer Database Generation Power Pack这允许使用模型优先方法增量构建数据库。问题是此功能使用的是 VS 数据库工具。我认为这些工具只适用于 SQL 服务器。我从不喜欢这些自动化工具,所以我仍然认为应该借助一些工具手动控制数据库升级,以获取当前和最后部署的数据库版本之间的差异脚本。仅在将新版本部署到生产环境时才需要 diff 脚本。在测试和开发环境中,您始终可以重新创建整个数据库。

    使用两个 EDMX 模型时应该不需要抽象。模型必须产生相同的概念层。在这种情况下,您只需要一组按约定映射的 POCO 类(与实体相同的类名,具有相同类型和可访问性的相同属性),因此它们将适用于两种模型。

    编辑:

    基于@Tridus 的回答,我只是补充说您可以先创建数据库并使用 EF 4.1 中的 fluentAPI 来映射它们。您的数据库必须具有完全相同的架构(表名、列名等),它们不能使用任何特定功能(我希望序列不会成为问题,因为这正是 Oracle 处理自动增量列的方式)。

    关于wcf - Entity Framework - 架构升级、多个 DBMS 和代码优先,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5527886/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com