2015-10-29 91 views
2

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

,我有以下页面中的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> 

而视图模型如下图所示

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应该可以正常工作。

(这大概应该已经开始与一个答案,所以这里将其添加的,而不是评论。)

+0

谢谢,我想过这个,之前我看了你的答案我尝试用这种方式,而是让我只是为了好奇才问你一些事情。 由于实体框架是一种较新的技术,不应该立即提供此功能吗? 我的意思是在DataTables中 - DataViews这个功能已经存在,如果你设置了正确的变量CommandBuilders等等。新的行或删除的行会自动更新。 – user2160275

+0

那么我知道有一些第三方库确实具有这种类型的集成(例如DevExpress),但我个人不希望.NET DataGrid具有此功能。它会在DataGrid和EF之间创建一个不需要的依赖关系,IMO。但是,自己继承并实现它并没有太多的工作,这样,DbContext和DataGrid之间的依赖关系就会成为您自己的(甚至是在数据源集合中)。很高兴你的工作虽然。 –

相关问题