Я пытаюсь определить, есть ли у сущности в EF4 изменения, которые нужно сохранить.
Через несколько лет после .NET ржавый - это определенно то слово, которое я бы использовал, чтобы описать, где я сейчас нахожусь.Я пытаюсь научиться использовать EF4 и WPF при повторном знакомстве с .NET.Я следовал нескольким учебникам по привязке данных Drag & Drop с помощью Entity Framework и WPF и создал приложение с несколькими Windows, которое постепенно расширяет мои знания.
Я использую простейшую частьМоя модель для моих тренировочных упражнений. Модель имеет сущности: Сеть и Лаборатория, между Сетями и Лабораториями существует связь «многие ко многим», а именно NetworkLabs, отношения не особенно важны сейчас, так как я все еще нахожусь на самых основах.
У меня есть окно, в котором в списке отображается список сетей, а рядом с ним находится DataGrid, в котором отображаются лаборатории в сети.Я смог сделать это довольно легко, следуя инструкциям, и в итоге получил код, подобный следующему:
Public Class NetworkListWindow
Private Function GetNetworksQuery(entities As UKNEQASEntities) As ObjectQuery(Of Network)
Dim networksQuery As ObjectQuery(Of Network) = entities.Networks
' Update the query to include NetworkLabs data in Networks.
networksQuery = networksQuery.Include("NetworkLabs")
' Returns an ObjectQuery
Return networksQuery
End Function
Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
Dim entities As UKNEQASEntities = New UKNEQASEntities()
' Load data into Networks.
Dim networksViewSource As CollectionViewSource = CType(Me.FindResource("UKNEQASEntitiesNetworksViewSource"), CollectionViewSource)
Dim networksQuery As ObjectQuery(Of Network) = GetNetworksQuery(entities)
networksViewSource.Source = networksQuery.Execute(MergeOption.AppendOnly)
End Sub
End Class
Это окно предназначено только для просмотра, пользователь может нажать кнопку редактирования, чтобы редактировать выбранную сеть.Во втором окне я сталкиваюсь с проблемами. В этом окне я перетащил сетевой объект из окна Источники данных, чтобы создать экран сведений (сетка с метками и текстовыми полями в строках и столбцах).В итоге я получил код, подобный следующему:
Public Class NetworkWindow
Private m_id As Integer
Private m_db As New UKNEQASEntities
Public Sub New(id As Integer)
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
m_id = id
End Sub
Private Function GetNetworkQuery() As ObjectQuery(Of Network)
Dim networkQuery As ObjectQuery(Of Network) = m_db.Networks
' Update the query to include only the Network we are editing
networkQuery = networkQuery.Where(Function(net) net.Id = m_id)
' Update the query to include NetworkLabs data in Networks.
networkQuery = networkQuery.Include("NetworkLabs")
' Returns an ObjectQuery
Return networkQuery
End Function
Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
' Load data into Networks.
Dim networkViewSource As CollectionViewSource = CType(Me.FindResource("UKNEQASEntitiesNetworksViewSource"), CollectionViewSource)
Dim networksQuery As ObjectQuery(Of Network) = GetNetworkQuery()
networkViewSource.Source = networksQuery.Execute(MergeOption.AppendOnly)
' Get laboratories that are not in any networks
Dim labResult = From laboratory In m_db.Laboratories _
Where _
Not _
(From networklab In m_db.NetworkLabs _
Select networklab.Laboratory.Id).Contains(laboratory.Id) _
Select laboratory
Dim laboratoriesViewSource As CollectionViewSource = CType(Me.FindResource("UKNEQASEntitiesLaboratoriesViewSource"), CollectionViewSource)
laboratoriesViewSource.Source = labResult.ToList
End Sub
End Class
И это прекрасно работает для отображения сети, выбранной на предыдущем экране, я поместил кнопку «Сохранить» на панель инструментов, которая просто вызывает
m_db.SaveChanges()
Сохранить изменения, и это тоже хорошо работает.Моя проблема возникает, когда пользователь обрабатывает данные, когда пользователь редактирует данные и закрывает окно, и я хочу определить, нуждается ли текущая сеть в сохранении обратно в базу данных, чтобы я мог подсказать пользователю, но не знаю, как получить доступ к сети.чтобы проверить.
Я подозреваю, что это как-то связано с кодом, подобным:
Dim networkViewSource As CollectionViewSource = CType(Me.FindResource("UKNEQASEntitiesNetworksViewSource"), CollectionViewSource)
Dim entry As ObjectStateEntry = m_db.ObjectStateManager.GetObjectStateEntry(....)
, но я не знаю, как заставить сеть передать GetObjectStateEntry.
На моем предыдущем экране списка я смог получить выбранную сеть, получив SelectedItem из списка, но я не могу найти ничего, что могло бы помочь мне в моем окне единой записи.
Я собираюсь сделать этоправильно?Для экрана редактирования однократной записи я все еще использую CollectionViewSource, как и для экрана списка, это лучший способ или есть что-то для отдельных объектов?
Я искал множество учебных пособий, и большинство из них яfind - это отображение данных для редактирования в DataGrids, а это не то, что я ищу.Я изо всех сил пытаюсь найти какую-либо помощь по созданию экранов для редактирования отдельных объектов, поэтому не знаю, как подобрать ссылку на объект, который редактирует пользователь.
Любая помощь очень ценится, так как я новичок вэтот EF и XAML жаворонок.