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