Как мне изменить свойство Linq, доступное только для чтения

StackOverflow https://stackoverflow.com/questions/95364

  •  01-07-2019
  •  | 
  •  

Вопрос

У меня есть класс, сгенерированный 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 увидеть мои изменения?

Это было полезно?

Решение

Установите существующее свойство TotalLogins либо как частное, либо как защищенное и удалите атрибут только для чтения.Вы также можете захотеть переименовать его, напримерВнутренние логины.

Затем создайте новое свойство вручную в частичном классе, который предоставляет его публично как свойство, доступное только для чтения:

Public ReadOnly Property TotalLogins() As System.Nullable(Of Integer)
    Get
        Return Me.InternalTotalLogins
    End Get
End Property

Другие советы

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

а затем обновите это .Я думаю, что по умолчанию он не сохранит свойства только для чтения.И вообще, почему это должно быть так.Сейчас это халтура, но, эй, такова жизнь.

Перед изменением поля вызовите SendPropertyChanging(), а затем после вызовите SendPropertyChanged("").Это заставит систему отслеживания объектов таблицы узнать, что что-то изменилось.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top