gpt4 book ai didi

c# - 使用 MVVM 模式向数据库添加数据

转载 作者:太空狗 更新时间:2023-10-30 00:19:26 26 4
gpt4 key购买 nike

我正在尝试将数据保存到数据库。

假设我有一个名为 Customers 的表,其中包含三个字段:

Id
FirstName
LastName

我使用 ADO.Net 实体数据模型创建了我的模型。

这是我的 ViewModel 代码

public class myViewModel : INotifyPropertyChanged
{
private string _firstName;
public string FirstName
{
get
{
return _firstName;
}
set
{
_firstName = value;
OnPropertyChanged("FirstName");
}
}

private string _lastName;
public string LastName
{
get
{
return _lastName;
}
set
{
_lastName = value;
OnPropertyChanged("LastName");
}
}

protected virtual void OnPropertyChanged(string PropertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(PropertyName));
}
}

public event PropertyChangedEventHandler PropertyChanged;

}

这是我的 MainWindow.xaml 文件:

<Window x:Class="Lab_Lite.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:Lab_Lite.ViewModels"
Title="MainWindow" Height="350" Width="525" WindowState="Maximized">

<Window.DataContext>
<vm:MainWindowViewModel />
</Window.DataContext>

<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>

<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>

<TextBlock Grid.Row="0" Grid.Column="0" Text="FirstName" />
<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding FirstName, Mode=TwoWay, UpdateSourceTrigger=Explicit}" />

<TextBlock Grid.Row="1" Grid.Column="0" Text="LastName" />
<TextBox Grid.Row="1" Grid.Column="1" Text="{Binding LastName, Mode=TwoWay, UpdateSourceTrigger=Explicit}" />

<Button Grid.Row="2" Grid.Column="1" Content="Save" />
</Grid>
</Window>

这里有两个问题:

1. How my ViewModel knows that FirstName property declared in ViewModel is 
referenced to FirstName Column in my database?
2. How to save changes to database when UpdateSourceTrigger is set to Explicit?

我想我已经使用 Command 在某种程度上找到了第二个问题的答案。但我不知道这是否正确,因为我不知道第一个问题的答案。

更新:

假设我有两个这样的表:

客户:

CustomerID
Name
GenderID //Foreign Key

性别:

GenderID
Value

现在 SaveCustomerChanges 方法中 CurrentCustomer.Gender 的值应该是多少?

最佳答案

我强烈建议您使用数据库优先的 Entity Framework (EF) 之类的 ORM,因为您已经创建了数据库。 Entity Framework 将自动为您创建 POCO(模型类,普通旧 C# 对象),还将创建一个名为 **YourDbName**Context 的类。这是你的DbContext .届时,您的应用程序将在每次运行您的应用程序时创建您的上下文实例,并且您将能够使用该上下文访问您的数据库。 EF 还将跟踪您所做的任何更改,因此这里是解决问题的方法:

EF 生成 POCO:

public partial class Customer
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}

在您的 View 模型中,您可以检索 List<Customer>()来自您的数据库。

public List<Customer> Customers { get; set; } //Load from context in constructor, really though you should do it in a service layer
public Customer CurrentCustomer { get; set; } //Current customer you need to edit

现在您在 View 模型中有两个选项:为了成为自然的 MVVM,您不应将 CurrentCustomer 绑定(bind)到 View 。那不符合模式。为了解决这个问题,您创建了单独的属性,就像上面那样,您可以返回 CurrentCustomer.PropertyName在 getter 中并像这样在 setter 中使用它:

public string FirstName
{
get
{
return CurrentCustomer.FirstName;
}
set
{
CurrentCustomer.FirstName = value;
OnPropertyChanged("FirstName");
}
}

通过这样做,您不必担心将 viewmodel 属性映射到 POCO 属性,但是您在 View 中所做的任何更改现在都会导致 Entity Framework 跟踪更改,在这种情况下,您现在需要做的就是在保存方法中调用 dbContext.SaveChanges(); .

如果您希望能够执行任何类型的取消或撤消操作,请保持您现在的属性设置:

private string _firstName;
public string FirstName
{
get
{
return _firstName;
}
set
{
_firstName = value;
OnPropertyChanged("FirstName");
}
}

并且在您的保存方法中,您必须将 View 模型属性映射到 CurrentCustomer 的属性,然后应该会导致跟踪更改:

private void SaveCustomerChanges()
{
//Could use Automapper to handle mapping for you.
CurrentCustomer.FirstName = this.FirstName;
CurrentCustomer.LastName = this.LastName;
dbContext.SaveChanges(); //dbContext will be named diff for you
}

此时更改应该已经完成​​并更新了数据库表。

现在,如果您不使用 Entity Framework,则需要设置某种数据访问层,您可以将 Customer 传递给该层。对象,然后您需要从数据库中检索该对象并更新其值。

查看 this as well!

编辑:调用SaveCustomerChanges()您需要使用 ICommand 连接此方法.

首先创建一个RelayCommand类:

public class RelayCommand : ICommand
{
private Action<object> _action;

public RelayCommand(Action<object> action)
{
_action = action;
}

#region ICommand Members

public bool CanExecute(object parameter)
{
return true;
}

public event EventHandler CanExecuteChanged;

public void Execute(object parameter)
{
_action(parameter);
}

#endregion
}

现在在你的 View 模型中:

public ICommand SaveChangesCommand { get; set; }

在您的 View 模型构造函数中

SaveChangesCommand = new RelayCommand(SaveCustomerChanges);

然后在 XAML 中连接 SaveChangesCommand:

<Button Content="Save" Command="{Binding SaveChangesCommand }" />

现在,当您单击“保存”时,命令应该触发 SaveCustomerChanges()方法。

关于c# - 使用 MVVM 模式向数据库添加数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20461783/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com