我们有一个系统将使用相同的代码与不同的客户端数据库进行通信。这些数据库将使用相同的 EF 模型,但连接字符串不同。
我们的问题是,并非每个站点都将使用相同版本的数据库结构;有些可能缺少一些列或包含一些旧列。
如果我们将系统升级到当前版本,现在数据库模型现在有一个额外的EmergencyContact
列。所有旧数据库现在都将失败,因为 EF 正在尝试插入此列(即使我们尚未为此属性设置值)。
有没有办法告诉 EF 在生成 INSERT INTO 查询时只使用我们有值的列?
我们有一个系统将使用相同的代码与不同的客户端数据库进行通信。这些数据库将使用相同的 EF 模型,但连接字符串不同。
我们的问题是,并非每个站点都将使用相同版本的数据库结构;有些可能缺少一些列或包含一些旧列。
如果我们将系统升级到当前版本,现在数据库模型现在有一个额外的EmergencyContact
列。所有旧数据库现在都将失败,因为 EF 正在尝试插入此列(即使我们尚未为此属性设置值)。
有没有办法告诉 EF 在生成 INSERT INTO 查询时只使用我们有值的列?
如果您的架构缺少真实数据库中的列,则 EF 会很好,但如果架构中有不在数据库中的列,EF 将无法正常工作,并且无法解决此问题。
您唯一的选择是为不同的数据库使用不同的模式,并编写管理它们的代码(即,仅实例化您需要的上下文版本)。
如果每个站点的持久层是唯一更改的部分,那么我会将您的 EF 模型提取到它自己的版本中,例如
DbV1.dll
DbV2.dll
然后,您可以根据客户端的某些设置加载适当的 DLL,即您可以将信息作为自定义标头传递,例如
db-version: 1
还有其他更可靠的方法,但是,我不知道您当前的设置如何,因此很难回答。
如果您的模型与您的数据库架构不匹配,EF 只会插入/更新模型中的列。但是,如果未知列不为空,EF 将抛出异常。此外,如果您在未知列上创建了关系约束,当然不会创建这些约束,因为它们还不知道。