使用setter处理数据库

时间:2015-02-05 10:25:16

标签: c#

在项目中,我有类 - 模型类(调用此类 - modelClass)。

我有一个类(称为此类 - dbClass),它提供了一些使用数据库的方法(db - Advantage数据库体系结构)。此类提供用于处理数据库的静态方法。我知道我可以使用一些ORM(如EF),存储库模式,但在这个项目中使用数据库的主要思想是使用静态方法的静态类。

在modelClass中,我有thi字段 - “Status”(字符串类型)。

当我设置字段“Status”时,我的用例是数据库中的更新记录。

您可以在下面看到我的解决方案:

public class modelClass{
    //here some fileds
    public string Status { get; set; }
    //here some fileds
}

public class dbClass{
    //here some fileds and method for work with database
    public static void update(modelClass mClass){
        //here update the record in database
    }
}
使用

....
modelClass.Status = "status";
dbClass.update(modelClass);
....

我提出了另一个解决方案。

我的决定是使用关键字“set”。

让我解释一下我的想法 - 当我在modelClass中设置字段时,我想在数据库中设置字段和更新记录。

例如:

public class modelClass{
    //here some fileds
    private string Status { get; set; }

    //create public setter
    public string setStatus{
        get { return Status; }
        set
        {
            Status = value;
            dbClass.update(this);
        }
    }

    //here some fileds
}
使用

modelClass.setStatus= "status";

主要问题是:

  1. 通过setter进行数据库的良好实践吗?
  2. 为什么我应该/不应该使用这个想法?
  3. 请解释一下我的想法的主要优点和缺点

2 个答案:

答案 0 :(得分:2)

因此,您试图区分以某种方式映射到数据库的类以及业务逻辑使用的类。我认为这是一个好主意。 您正在考虑在域驱动设计中也会发现的元素,其中域名是“持久性无知”,即不知道它是如何,在何处或以何种形式存在被坚持下去。

但是,我认为有更优雅的方式来实现它。通过&包装'在模型类中的dbclass中,您可以在数据库中创建一个依赖形式,并且这正是您要避免的事情。

我所使用的是模型类,以及这些模型类的IRepositories。存储库的实现是了解持久性介质的实现。可以通过EF对抗SQL服务器,可能是Azure的东西。

如果发生更新,此repo将从数据库中保存dbclass,然后从提供的modelclass更新属性(如您所说)。例如,您可以使用AutoMapper来处理此映射。如果您的所有属性都具有相同的名称和类型 - 它只是一个单行:

OrderDto dto = Mapper.Map<OrderDto>(order);

答案 1 :(得分:1)

不,这不是好习惯。

有两个原因:

  1. 它会频繁地与数据库同步。
  2. 手动为数据库中的每一列创建setter是不方便的。
  3. 通常,ORM实现有一种遍历所有属性的方法,例如,使用反射。

    此外,它还有一个'save'方法,以便您在完成分配字段后可以在一次调用数据库中刷新值。