NAngelUK Ответов: 1

Vb.net - можно ли перезаписать сеттер свойства entityframework-auto-generated и поддерживать это изменение независимо от любой регенерации модели?


Использование EF6 и VS2015 с первой моделью базы данных
Одна из таблиц называется "клиент", и одним из ее полей является DOB as Date.

EF генерирует модель и создает файл Customer.vb с содержимым
'------------------------------------------------------------------------------
' <auto-generated>
'     This code was generated from a template.
'
'     Manual changes to this file may cause unexpected behavior in your application.
'     Manual changes to this file will be overwritten if the code is regenerated.
' </auto-generated>
'------------------------------------------------------------------------------

Imports System
Imports System.Collections.Generic

Partial Public Class Customer
    Public Property Id As Integer
    Public Property LastName As String
    Public Property FirstName As String
    Public Property DOB As Date
    Public Property Added As Date

    Public Overridable Property Visits As ICollection(Of Visit) = New HashSet(Of Visit)

End Class


Чего я хочу добиться, если это возможно, так это запустить этот метод
Public Function GetAgeFromDates(dob as Date, optional someDate as Date = Date.Now

и сохраните возвращаемое значение в переменной
Private _AgeOnDate As Integer
Public ReadOnly Property AgeOnDate As Integer
    Get
        Return _AgeOnDate
    End Get
End Property

при изменении значения DOB.

Что я уже пробовал:

Предупреждение EntityFramework, в начале файла Customer.vb говорится:
'     Manual changes to this file will be overwritten if the code is regenerated.


Желая расширить автоматически сгенерированный класс Customer и защитить эти изменения от любой регенерации модели, я создал отдельный файл CustomerExtended.vb с таким содержимым, как

Partial Public Class Patient

    Private _AgeOnDate As Integer
    Public ReadOnly Property AgeOnDate As Integer
        Get
            Return _AgeOnDate
        End Get
    End Property
End Sub


Теперь мой вопрос таков:

Возможно ли каким-то образом иметь где-то в CustomerExtended.vb расширенную версию Customer Setter, например:

Public Property DOB As Date
     Set(value As Date)
         _DOB = value
         _AgeOnDate = GetAgeFromDates(value, Date.Now)
     End Set
 End Property


Чтобы сделать его коротким:
Можно ли перезаписать сеттер автоматически генерируемого свойства EF и защитить этот код-расширение от потери его при каждой регенерации модели?

1 Ответов

Рейтинг:
1

Dave Kreskowiak

Нет, это невозможно. Если вы собираетесь использовать базу данных в первую очередь, вам понадобится метод, чтобы выполнить эту работу, потому что регенерация перезапишет весь файл. Это не будет касаться вашей второй файл с AgeOnDate вещи в нем. Проблема заключается в том, что вы не можете переопределить сгенерированный код в первом (сгенерированном) файле.

Использование кода сначала вместо базы данных сначала позволило бы избежать всего этого. Регенерации не происходит, потому что вы пишете весь код для классов и для генерации базы данных на сервере.