У меня есть автоматически сгенерированные классы linq to sql, и я расширяю этот класс, используя частичную классификацию (вместо использования наследования), и у меня есть свойства, которые я добавил позже, которые не являются частью модели базы данных и не должно быть. это такие вещи, как «FinalPrice» и «DisplayFinalPrice» - в базе данных есть только RetailPrice и WholesalePrice, поэтому FinalPrice и т. д. больше похожи на расширения полей dbase.
Когда я отправляю форму без заполнения, вызывается «FinalPrice» («get» свойства), даже если я никогда не запрашиваю его, и даже если он не нужен. это происходит перед проверкой, поэтому я даже не получаю ошибок проверки, которые я получу.
Я пытался использовать и свойства FinalPrice и FinalPriceDisplay - нет! почему это происходит и как я могу остановить это? Состояния модели просто пытаются все проверить, поэтому он вызывает каждый элемент, несмотря ни на что?
для интересующихся, вот весь код ...
Частичный публичный класс tProduct
Наследует тПродукт
Private Const CommissionMultiplier As Decimal = CDec (1.18)
Частная _FinalPrice как десятичная дробь?
Частная _DisplayFinalPrice As String
Частная _DisplayNormalPrice As String
Public Property CategoryComplete As Short
<ScaffoldColumn(False)>
Public ReadOnly Property FinalPrice As Decimal
Get
'If RetailPrice IsNot Nothing OrElse WholesalePrice IsNot Nothing Then
If _FinalPrice Is Nothing Then
If RetailPrice IsNot Nothing Then
_FinalPrice = RetailPrice
Else
_FinalPrice = WholesalePrice * CommissionMultiplier ' TODO: this should be rounded to the nearest 5th cent so prices don't look weird.
End If
Dim NormalPart = Decimal.Floor(_FinalPrice.Value)
Dim DecimalPart = _FinalPrice.Value - NormalPart
If DecimalPart = 0 OrElse DecimalPart = 0.5 Then
Return _FinalPrice
ElseIf DecimalPart > 0 AndAlso DecimalPart < 0.5 Then
DecimalPart = 0.5 ' always rounded up to the nearest 50 cents.
ElseIf DecimalPart > 0.5 AndAlso DecimalPart < 1 Then
' Only in this case round down if its about to be rounded up to a valeu like 20, 30 or 50 etc as we want most prices to end in 9.
If NormalPart.ToString.LastChr.ToInt = 9 Then
DecimalPart = 0.5
Else
DecimalPart = 1
End If
End If
_FinalPrice = NormalPart + DecimalPart
End If
Return _FinalPrice
'End If
End Get
End Property
<ScaffoldColumn(False)>
Public ReadOnly Property DisplayFinalPrice As String
Get
If _DisplayFinalPrice.IsNullOrEmpty Then
_DisplayFinalPrice = FormatCurrency(FinalPrice, 2, TriState.True)
End If
Return _DisplayFinalPrice
End Get
End Property
Public ReadOnly Property DisplayNormalPrice As String
Get
If _DisplayNormalPrice.IsNullOrEmpty Then
_DisplayNormalPrice = FormatCurrency(NormalPrice, 2, TriState.True)
End If
Return _DisplayNormalPrice
End Get
End Property
Public ReadOnly Property DivID As String
Get
Return "pdiv" & ProductID
End Get
End Property
End Class
подробнее ...
Я тут попал, за исключением нулевой ссылки, говорящей, что она должна содержать значение ...
Dim NormalPart = Decimal.Floor(_FinalPrice.Value)
Я могу избавиться от проблемы, просто завернув закомментированный оператор if в коде, но это не должно вызываться для начала, и это проблема, с которой я столкнулся.