受け入れられた回答で提案された方法を使用して、私はいくつかの問題に遭遇しました。私は私のために働いた代替ソリューションを提供します。
このクエリの実行中にエラーが発生しました:
oDb.LogEntries.SingleOrDefault(Function(LogEntry) LogEntry.LogTime = dDate)
エラーメッセージ:
'LogEntry'の'MinutesOffline'プロパティを'System.Int32'値に設定できませんでした。このプロパティは、タイプ'System.Single'のnull以外の値に設定する必要があります。
ご覧のとおり、EF6.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への帽子のヒント。