Структура сущности "Код сначала из базы данных" ObservableCollection и файл .t4 - PullRequest
0 голосов
/ 30 октября 2018

Моя конечная цель состоит в том, чтобы модель EF работала вместе с sqlite local db. Dev собирается задействовать много модификаций базы данных и, следовательно, много обновлений модели. Графический интерфейс будет использовать множество видов Master-Detail для редактирования данных.

Я подумал, что для того, чтобы заставить рабочие виды основных деталей работать, вы должны заменить ICollection и HashSet на ObservableCollection. Я достигаю этого через пользовательский класс ObservableListSource.

Я разочаровался в попытках достичь этого через "базу данных в первую очередь". Существует много ограничений / упущений в опции «обновить модель из базы данных». Например, он не обновляет какие-либо измененные поля или отношения, а это означает, что вам нужно снова удалить и заново наложить всю модель. Затем вам нужно изменить файлы .tt, чтобы изменить Hashset и ICollection на ObservableListSource. В целом, метод просто кажется слишком длинным и хитрым.

Таким образом, заглянул в опцию «Сначала код из базы данных». На начальных тестах кажется гораздо более надежным и надежным, чем база данных в первую очередь. Тем не менее, он не генерирует и .tt файлы, что позволит вам изменить все записи ICollection в сгенерированных классах.

Я нашел это:

Изменение сгенерированных классов из "Code First From Database" EF6

И успешно загрузил файл .t4. Мне удалось заменить HashSet на ObservableListSource, исправив код. Извлечение файла fuill entity.t4:

        Public Sub New()
    <#
        foreach (var collectionProperty in collectionProperties)
        {
    #>
            <#= code.Property(collectionProperty) #> = New ObservableListSource(Of <#= code.Type(collectionProperty.ToEndMember.GetEntityType()) #>)()
    <#
        }
    #>
        End Sub

Теперь это работает .. когда классы / сущности генерируются, замена происходит правильно. Тем не менее, я не могу заставить то же самое работать для ICollection. Пример того, как это генерируется в классе сущности:

<Table("dbControl")>
Partial Public Class dbControl
    Public Sub New()
        dbController_Controls = New ObservableListSource(Of dbController_Controls)()
    End Sub

    Public Property ID As Long

    <StringLength(2147483647)>
    Public Property Name As String

    Public Property ControlTypeID As Long?

    Public Property ControlAssociationID As Long?

    Public Overridable Property dbControlAssociation As dbControlAssociation

    Public Overridable Property dbControlType As dbControlType

    Public Overridable Property dbController_Controls As ICollection(Of dbController_Controls)
End Class

Соответствующая часть EntityType.t4 выглядит так:

    foreach (var navigationProperty in entityType.NavigationProperties)
    {
        if (!first)
        {
            WriteLine(string.Empty);
        }
        else
        {
            first = false;
        }
#>
    Public Overridable Property <#= code.Property(navigationProperty) #> As <#= code.Type(navigationProperty) #>
<#
    }
#>
End Class

Однако в файле нет конкретной ссылки на ICollection. Следовательно, в отличие от HashSet

прямая замена не представляется возможной

У кого-нибудь есть идеи?

Я близок к тому, чтобы полностью отказаться от Entity Framework, так как он оказывается немного темпераментным / приводящим в бешенство! Любая помощь приветствуется

...