У меня есть созданный LINQ to SQL класс со свойством только для чтения:
<Column(Name: = "totalLogins", Storage: = "_TotalLogins", DbType: = "Int", UpdateCheck:=UpdateCheck.Never)> _
Public ReadOnly Property TotalLogins() As System.Nullable(Of Integer)
Get
Return Me._TotalLogins
End Get
End Property
Это предотвращает его изменение извне, но я хотел бы обновить свойство из моего класса, как показано ниже:
Partial Public Class User
...
Public Shared Sub Login(Username, Password)
ValidateCredentials(UserName, Password)
Dim dc As New MyDataContext()
Dim user As User = (from u in dc.Users select u where u.UserName = Username)).FirstOrDefault()
user._TotalLogins += 1
dc.SubmitChanges()
End Sub
...
End Class
Но вызов user._TotalLogins + = 1 не записывается в базу данных? Есть мысли о том, как заставить LINQ видеть мои изменения?





Make a second property that is protected or internal(?)
<Column(Name: = "totalLogins", Storage: = "_TotalLogins", DbType: = "Int", UpdateCheck:=UpdateCheck.Never)> _
protected Property TotalLogins2() As System.Nullable(Of Integer)
Get
Return Me._TotalLogins
End Get
Set(byval value as System.Nullable(Of Integer))
Return Me._TotalLogins
End Get
End Property
а затем обновите это. Я думаю, что по умолчанию он не будет сохранять свойства только для чтения. Да и зачем это вообще нужно. Я сейчас это хак, но это жизнь.
Установите существующее свойство TotalLogins как частное или защищенное и удалите атрибут readonly. Вы также можете переименовать его, например InternalTotalLogins.
Затем вручную создайте новое свойство в частичном классе, которое публично предоставляет его как свойство только для чтения:
Public ReadOnly Property TotalLogins() As System.Nullable(Of Integer)
Get
Return Me.InternalTotalLogins
End Get
End Property
Перед изменением поля вызовите SendPropertyChanging (), а затем после вызова SendPropertyChanged (""). Это позволит отслеживанию сущности таблицы узнать, что что-то изменилось.