MVVM - SQL连接在哪里?

时间:2016-09-19 02:51:40

标签: .net wpf mvvm

学习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.");
    }

2 个答案:

答案 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我。

  • 注意:验证是一个棘手的部分,因为它既是业务逻辑,也是大多数情况下的表示逻辑。但这是另一个话题。