学习MVVM,我想我有一个基本的样本正在运行
让我们说更新SQL直接
见link
链接:模型(业务规则,数据访问,模型类)
我假设数据访问包括SQL
但在该链接中,数据访问位于ViewModel中
这是对的吗?
请解释
模型只是商业实体吗?
public class CreateEmployeeViewModel : INotifyPropertyChanged
{
private string _id;
private string _firstName;
private string _address;
public CreateEmployeeViewModel()
{
SaveCommand = new DelegateCommand(Save, () => CanSave);
}
public string ID
{
get { return _id; }
set
{
_id = value;
NotifyOfPropertyChange("ID");
}
}
public string FirstName
{
get { return _firstName; }
set
{
_firstName = value;
NotifyOfPropertyChange("FirstName");
}
}
public string Address
{
get { return _address; }
set
{
_address = value;
NotifyOfPropertyChange("Address");
}
}
public ICommand SaveCommand { get; private set; }
public bool CanSave
{
get { return !string.IsNullOrEmpty(ID) && !string.IsNullOrEmpty(FirstName); }
}
string connectionString =
@"Data Source=RAVINDRA\MSSQLSERVERS;Initial Catalog=CrudMethod;Integrated Security=SSPI;";
public void Save()
{
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = con.CreateCommand();
cmd.CommandText = "INSERT INTO Users(ID,FirstName,Address)VALUES(@ID,@FirstName,@Address)";
cmd.Parameters.AddWithValue("@ID", ID);
cmd.Parameters.AddWithValue("@FirstName", FirstName);
cmd.Parameters.AddWithValue("@Address", Address);
try
{
con.Open();
cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{
throw ex;
}
finally
{
con.Close();
}
MessageBox.Show("Data Saved Successfully.");
}
答案 0 :(得分:1)
MVVM没有指定SqlConnection必须在哪里;它描述了与UI相关的责任。
在许多情况下,一个体系结构将包含多个ViewModel,这些ViewModel需要连接到数据库,以便让它们全部连接而不重复代码,将连接分解为一个单独的类是有意义的。无论是完整的数据层,EF模块还是简单的单一类都是需要和偏好的问题。
答案 1 :(得分:1)
好的,你所做的是没有模型的MVVM。我认为你开始使用UX第一种方法开发应用程序,这是完全有效的。您创建了视图,而不是一些进入视图的DataContext的类,以便利用所有xaml绑定。这些类恰好被称为ViewModels。
ViewModel的职责是以可轻松从View中获取的方式公开数据和逻辑。这是你的viewmodel正在做什么?是的,更多的是更少。
但是让我们接下来思考。您可能还需要阅读创建的员工,并更新或删除它们。您将在不仅仅是View中访问它们。如果你继续在ViewModels中编写SQL语句,你很可能最终会违反“不要重复自己”#34;原则&#34 ;.例如,您必须在每个SQL语句中重复列名,如FirstName,Address。如果添加了验证,例如FirstName的最小长度,则必须在多个视图模型中重新实现验证。那是对DRY的违反。如果您提取DataAccess逻辑和验证,那么您有一个Model。
模型不一定是实体模型。从viewmodel中提取数据访问和业务逻辑最简单的方法是:
public class EmployeeModel
{
private const string connectionString =
@"Data Source=RAVINDRA\MSSQLSERVERS;Initial Catalog=CrudMethod;Integrated Security=SSPI;";
public void CreateEmployee(string ID, string firstName, string address)
{
if (string.IsNullOrEmpty(ID))
{
throw new ArgumentException(nameof(ID));
}
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = con.CreateCommand();
cmd.CommandText = "INSERT INTO Users(ID,FirstName,Address)VALUES(@ID,@FirstName,@Address)";
cmd.Parameters.AddWithValue("@ID", ID);
cmd.Parameters.AddWithValue("@FirstName", FirstName);
cmd.Parameters.AddWithValue("@Address", Address);
try
{
con.Open();
cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{
throw; //use this instead throw ex, since it rewrites the callstack.
}
finally
{
con.Close();
}
}
}
然而,您很快就会发现使用EntityFramework CodeFirst对您来说会更容易和务实,因为EntityFramework为您做了很多事情。但我鼓励您继续使用ADO.NET(SQL命令)编写自己的DataAccess。然后,您将更好地了解EntityFramework的优点。如果您对EntityFramework的好处特别感兴趣,特别是在MVVM应用程序中,请提出一个新问题并在评论中ping我。