Моя конечная цель состоит в том, чтобы модель 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, так как он оказывается немного темпераментным / приводящим в бешенство! Любая помощь приветствуется