如何使用实体框架从 DataGrid 更新数据库

Posted

技术标签:

【中文标题】如何使用实体框架从 DataGrid 更新数据库【英文标题】:How to update database from DataGrid using Entity Framework 【发布时间】:2016-01-29 06:19:35 【问题描述】:

我正在尝试在 带有实体框架的 Wpf DataGrid 上使用 CRUD 操作。 现有行可以成功修改,并在单击保存按钮时保存更改。当涉及到新行时,实体框架 SaveChanges 出于某种原因不会保存新行。我认为这很容易,但我不明白这里做错了什么。

我在 wpf 中有以下页面

<Page x:Class="TaxGroupsListing"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  xmlns:local="clr-namespace:wendbooksVatRatSetup"
  mc:Ignorable="d" 
  d:DesignHeight="300" d:DesignWidth="300"
  Title="TaxGroupsListing">
<Page.DataContext>
    <local:TaxGroupListingVM  x:Name="test"></local:TaxGroupListingVM>
</Page.DataContext>
<DockPanel >
    <Button Margin="2"  DockPanel.Dock="Top" Content="Load" Command="Binding Path=LoadCmd"></Button>
    <Button Margin="2" DockPanel.Dock="Top" Content="Save" Command="Binding Path=SaveCmd"></Button>
    <DataGrid  IsSynchronizedWithCurrentItem="True" Margin="2" CanUserAddRows="True" 
              ItemsSource="Binding Groups,UpdateSourceTrigger=PropertyChanged">
    </DataGrid>
</DockPanel>

这里显示的 ViewModel

Public Class TaxGroupListingVM : Implements INotifyPropertyChanged
Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
Sub notify()
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(String.Empty))
End Sub
Property Groups As New ObservableCollection(Of TaxGroup)
Property LoadCmd As New mycommad(AddressOf LoadData)
Property SaveCmd As New mycommad(AddressOf SaveData)
Private db As New SQlDataBaseEntities
Private Sub SaveData()
    db.SaveChanges()
    LoadData()
End Sub
Private Sub LoadData()
    Dim qry = From g As TaxGroup In db.TaxGroups Select g
    Groups = New ObservableCollection(Of TaxGroup)
    For Each item In qry
        Groups.Add(item)
    Next
    notify()
End Sub
End Class

【问题讨论】:

【参考方案1】:

当您添加一个新行时,它只是将一个新项目添加到 Groups 集合中,而不是将该项目添加到 DbContext。

添加新行时,处理 Groups 集合的 CollectionChanged 事件,并将新项目添加到 DbContext(类似于 db.TaxGroups.Add(newItem))。然后 db.SaveChanges 应该可以正常工作。

(这可能应该是一个开始的答案,所以在这里添加它而不是评论。)

【讨论】:

谢谢你,我想到了这个,在我阅读你的答案之前我尝试过这种方式,但让我问你一些事情只是出于好奇。由于 Entity-Framework 是一种较新的技术,不应该开箱即用地准备好这个功能吗?我的意思是在 DataTables - DataViews 如果您设置正确的变量 CommandBuilders 等,此功能已经存在。新行或删除的行会自动更新。 我知道有一些第三方库确实具有这种类型的集成(例如 DevExpress),但我个人不希望 .NET DataGrid 具有此功能。它会在 DataGrid 和 EF 之间创建一个不必要的依赖关系,IMO。但是,您自己子类化和实现它不会有太多工作,这样 DbContext 和 DataGrid 之间的依赖关系将是您自己的(甚至在数据源集合中)。很高兴你让它工作了。

以上是关于如何使用实体框架从 DataGrid 更新数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何使用实体框架更新数据库中的记录时覆盖模型验证

从 id 列表更新实体框架中的多行

在 DataGrid 中编辑后直接保存实体

如何将部分更新操作从 ObjectContext 转换为 DbContext

如何使用实体框架更新批量数据?

实体框架加入 ms-access