【问题标题】:How do I implement versioning with Entity Framework如何使用实体框架实现版本控制
【发布时间】:2014-08-16 09:06:37
【问题描述】:

我有一个将逐步构建的项目。

该项目是一个桌面应用程序,带有实体框架和包,如下所示:

实体框架 + DAL -> 应用程序 + 逻辑等

1.0 版有 2 个对象:

  • 博客
  • 发布

所以我把它打包并发送给我的客户,他想要一些改变,我在整个系统上取得了进一步的进展。

2.0 版现在有 3 个对象:

  • 博客
  • 发布
  • 用户

使用 Entity Framework,数据库架构不再匹配 V1.0,因此第一个版本现在已失效并引发错误。我希望我的客户仍然能够使用 1.0 版。我如何/应该如何构建我的应用程序以允许继续使用 V1?

为 EnglishBob 编辑:

我希望我的客户仍然能够使用 V1。假设他有一个测试部门,他们需要能够使用他们的 LIVE DB,或者他难以有效地跨部门扩展应用程序,因此必须同时运行 v1 和 v2。

【问题讨论】:

  • 这将是非常困难的。众所周知,ORM 不能很好地处理架构更改。
  • 我知道这一点,但肯定有一些人尝试过并且失败/成功了,我想知道如何。 IE。它们之间的层具有始终最新的 API,或者运行 EF 的方式忽略更新的更改。
  • 你可以做什么:1.先使用代码,在继承链中构建一个差异上下文链,2.在加载时确定db版本并加载正确的上下文
  • 如果您的架构更改仅限于添加表,这是最简单的。对于实体级别的更改,您还需要处理空字段。
  • oop继承的中心思想是处理版本控制

标签: c# entity-framework versioning


【解决方案1】:

一种选择是通过 RESTFUL Webservices 包装您的业务逻辑,这样客户端就不会直接访问数据库,而只有服务返回的版本化数据和 OR 映射发生在服务器端。 在 RESTFUL Webservices 中,对象的每个表示都由一个特殊的 uri 标识,例如“www.example.com/rest/api/2/posts”,其中 2 表示版本 2 的 Post 表示。REST 表示可以不同于目标对象的存储在数据库中。 在客户端,需要一个 http 客户端,以获取 json 或 xml 表示,并且客户端必须将其转换为 POCO。 在带有 JAXB 的 Java 中,可以对类进行注释,以便框架完成序列化和反序列化过程。也许.NET 也支持这样的注释。 如果引入了新列,您的客户可以忽略它,但是如果删除、更改或关系更改了列,则版本必须增加到 3,并且版本 2 的 uri 必须返回旧客户已经理解的表示。 我认为如果在服务器端没有额外的层,数据库中复杂更改的版本控制几乎是不可能的。 一个简单的例子是一个用户与地址的一对一关系,这将被更改为一对多。

【讨论】:

  • 谢谢,这是我计划对我的应用程序进行版本控制的方式。您是否考虑过替代方案,这是最好的和/或唯一的方法吗?
  • 将 db 公开为 rest 服务意味着您将版本控制转储到客户端上,客户端无法使用 ef 或预制代理。除非万不得已,否则不推荐。
  • 问题是客户对未来的变化一无所知。如果唯一的更改是新添加的列,则可以使用键、值和类型来设计数据库,其中键是字段的名称,类型表示客户端必须将值转换为什么类型。在android中,ContactsProvider使用了这样的概念,可以存储来自不同数据源的数据(参见此链接中与数据的关系->developer.android.com/guide/topics/providers/…)。
  • 问题是用 ef 做版本控制。如果可以放弃 ef,则有多种低级方式来处理数据库版本控制。但是你失去了 ef 的 ORM 能力。
  • 我认为只要 DTO 是分离的,他们就会“携带”他们自己的版本,因为一旦发布,它们就不会包含未来的变化。只要客户端可以“对话”到正确版本的 API,理论就成立了。
【解决方案2】:

最好维护 2 个数据库,一个测试数据库和一个生产数据库。将您的客户指向生产数据库并在测试数据库上进行开发。将 V2 发送给客户后,更新生产数据库并让他知道 V1 现在已过时。

如果数据库架构已更改,我看不到任何其他解决方法。

【讨论】:

  • 我希望我的客户仍然能够使用 V1。假设他有一个测试部门,他们需要能够使用他们的 LIVE DB,或者他难以有效地跨部门扩展应用程序,因此必须同时运行 v1 和 v2。
  • 感谢铁匠铺的信息。我认为在实践中,您会发现为以前的接口保持向后兼容性非常麻烦,并且会增加应用程序的复杂性。它所做的只是将问题从客户端转移到服务器以进行更多工作。虽然如果这是客户需要的,我想别无选择,祝项目好运! :)
  • 关注@englishbob 我目前在一个项目上遇到困难,幸好它只针对 1 个客户,但我们正在考虑在接下来的几个月内进行扩展。我现在需要准备:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多