【问题标题】:MVVM - where is the SQL connection?MVVM - SQL 连接在哪里?
【发布时间】:2016-09-19 02:51:40
【问题描述】:

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

【问题讨论】:

  • 你需要学习实体框架(youtube 搜索:kudvenkat)或者只是做一个数据访问层。 View-model 就像业务逻辑层
  • @PamingkasSevada EF 不适合目标应用程序。我有超过 2 亿行的表和超过 200 行的一些非常自定义的查询。这是我正在修改的 WPF。用户可以在类似 sql 的语法中指定查询,但我使用没有 LINQ 等效项或变得非常丑陋的新搜索运算符抽象出连接。就像来自 john as suzie 的电子邮件一样。那么什么是模型?模型是否主要只是主要只是定义实体?
  • 我有一个涉及 mvvm 的论文项目,但我使用了数据访问层。没有人关心你是否严格遵循了架构,不管你是否仍然在你的视图中编写代码,只要你交付了客户想要的东西。
  • @PamingkasSevada 我有点想以我计划作为开源发布的一般方式来做这件事。但我有点学习 MVVM 不是一回事。请验证直接到 SQL 是否在 ViewModel 中?
  • @Paparazzi 按照你最初的想法去做——“模型”的定义非常松散,通常涉及存储库访问(即 SQL 调用、调用服务层然后检索数据、调用 EF)和数据对象本身。一旦您的项目开始变大,您就会开始将事物分成正式的层,因此该模型是 n 层方法中的一层。

标签: .net wpf mvvm


【解决方案1】:

好的,您所做的是没有模型的 MVVM。我假设您开始使用 UX 优先方法开发您的应用程序,这是完全有效的。您已经创建了您的视图,而不是一些进入您视图的 DataContext 的类,以便利用所有 xaml 绑定。这些类恰好被称为 ViewModels。

ViewModel 的职责是以易于从 View 消费的方式公开数据和逻辑。那是您的视图模型正在做什么吗?是的,少花钱多办事。

但是让我们接下来想想。您可能还希望阅读创建的员工,并更新或删除它们。您不仅可以通过 View 访问它们。如果您继续在 ViewModel 中编写 SQL 语句,您很可能会违反“不要重复自己”原则。例如,您必须在每个 SQL 语句中重复 FirstName、Address 等列名。如果您添加了验证,例如 FirstName 的最小长度,您必须在多个视图模型中重新实现验证。这违反了 DRY。如果您提取 DataAccess 逻辑和验证,您就有了一个模型。

模型不一定是实体模型。从视图模型中提取数据访问和业务逻辑的最简单方法是:

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 应用程序)感兴趣,请提出新问题并在评论中联系我。

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

【讨论】:

  • 那不是我的申请。这是一个链接。我只是想弄清楚 SQL 应该去哪里。我谷歌“SQL MVVM”,搜索了很多,这是我唯一找到的。访问 VM 中的数据库对我来说似乎是错误的,所以我在这里问。真正的应用程序在数据方面是庞大而复杂的,并且需要 SQL。在 UI 方面没有太多可展示的内容。
  • 嗯,MVVM 的目标之一是让应用程序逻辑可测试。如果您可以直接在 VM 中访问数据,那么很难进行测试。 MVVM 不是很好定义的框架。每个人对它应该是什么都有自己的理解。只需定义您的目标,例如 VS Designer 中的可测试性、可维护性、设计时数据支持等。我相信,当您定义组件的职责时,例如 ViewModel,您会牢记 SRP 和 DRY 原则,那么您的问题将是自然回答:)
  • 无论如何,MVVM 中的 Model 代表“数据访问和业务逻辑”。 SQL 是数据访问,因此模型的定义非常直接地回答了您的问题。
  • 这就是我的想法,但正如我在经过一番搜索后所说的那样,这是我找到的第一个 SQL 连接,它位于示例 VM 代码中。
【解决方案2】:

MVVM 没有指定 SqlConnection 必须在哪里;它描述了与 UI 相关的职责。

在许多情况下,架构将包含多个需要连接到数据库的 ViewModel,因此要让它们全部连接而无需复制代码,将连接分解为单独的类是有意义的。无论是完整的数据层、EF 模块还是简单的单个类,都是需要和偏好的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-18
    • 2017-12-07
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多