我在使用被接受答案中提出的方法时遇到了一些问题。我提供了一个替代方案,这个方案对我很有效。
当运行这个查询时,我遇到了一个失败:
oDb.LogEntries.SingleOrDefault(Function(LogEntry) LogEntry.LogTime = dDate)
错误信息:
'LogEntry'的'MinutesOffline'属性无法设置为'System.Int32'值。您必须将此属性设置为'System.Single'类型的非空值。
我们可以看到,EF 6.2正在尝试向属性写入一个值。这是否是因为EF内部尝试写入“私有集合”导致的,我不知道。但最终结果是失败了。
与其将列设置为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
它还有一个额外的好处,即我们不必在生成的迁移中注释任何行。
我们仍然需要在Up()
中进行自定义的Sql()
调用:
ALTER TABLE [LogEntries] ADD [MinutesOffline] AS (IIF([Scale] < 1, 5, 0)) PERSISTED
......而且PERSISTED
关键字在此处有效。这将变成一个持久化的计算列。
你的经验可能会有所不同。
--编辑--
我发现为什么会出现转换错误了;这与迁移无关,而是与我的代码有关。我没有在创建时正确地对计算列进行转换:
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的帮助。