我使用接受的答案中提出的方法遇到了一些麻烦。我提供了一个对我有用的替代解决方案。
运行此查询时遇到错误:
oDb.LogEntries.SingleOrDefault(Function(LogEntry) LogEntry.LogTime = dDate)
错误信息:
'LogEntry' 上的 'MinutesOffline' 属性无法设置为 'System.Int32' 值。您必须将此属性设置为“System.Single”类型的非空值。
正如我们所见,EF 6.2 正在尝试将值写入属性。这是否是由于 EF 在内部尝试写入Private Set
,我不知道。它几乎看起来像。但最终结果才是最重要的:声明失败。
我没有将列设置为DatabaseGeneratedOption.Computed
,而是完全忽略了它:Builder.Entity(Of LogEntry).Ignore(Function(LogEntry) LogEntry.MinutesOffline)
.
这使我能够创建一个只读属性:
Public ReadOnly Property MinutesOffline As Single
Get
Return IIf(Me.Scale < 1, 5, 0)
End Get
End Property
它还有一个额外的好处,就是我们不必在生成的迁移中注释掉任何行。
我们仍然需要进行自定义Sql()
调用Up()
:
ALTER TABLE [LogEntries] ADD [MinutesOffline] AS (IIF([Scale] < 1, 5, 0)) PERSISTED
...并且PERSISTED
关键字确实在这里起作用。这将成为一个持久计算列。
YMMV
- 编辑 -
我发现了为什么会出现投射错误;它与迁移无关,与我的代码有关。我在创建时没有正确转换计算列:
ALTER TABLE [LogEntries] ADD [MinutesOffline] AS (IIF([Scale] < 1, 5, 0)) PERSISTED
这样做的正确语法是这样的:
ALTER TABLE [LogEntries] ADD [MinutesOffline] AS (CAST((IIF([Scale] < 1, 5, 0)) AS REAL)) PERSISTED
因此,我已恢复Ignore()
调用并将所有内容切换回接受的答案中提出的方法。
向JotaBe 致敬以寻求帮助。