代码之家  ›  专栏  ›  技术社区  ›  GONeale

Linq to SQL是否使用ActiveRecord模式?

  •  3
  • GONeale  · 技术社区  · 16 年前

    我刚刚研究了ActiveRecord模式,基于此( http://en.wikipedia.org/wiki/Active_record_pattern )似乎Linq2 SQL或多或少实现了这一点,我错了吗?或者需要对其进行什么更改以符合ActiveRecord模式?

    3 回复  |  直到 16 年前
        1
  •  8
  •   Wyatt Barnett    16 年前

    在某些方面,它感觉像一个活动的记录模式,但实际上不是。基本示例:

    //load the entity
    var c = myDataContext.Customers.FirstOrDefault(c => c.Id == 1876);
    c.Name = "George Armstrong Custer";
     // saves the entity 
    myDataContext.SubmitChanges();
    

    活动记录

    //load the entity
    var c = Customer.GetCustomer(9);
    c.Name = "Varus";
    //save the entity
    c.Save();
    

    活动记录实际上只涉及一个类,该类包含模型并向SQL提供数据接口Linq,它遵循不同的路径,其中有几个模型类和一个单独的数据接口,也就是说,一个存储库。

    PS:对于使用活动记录模式的ORM的一个很好的示例,请签出 Subsonic .

        2
  •  3
  •   Justin Niessner    16 年前

    linq to sql本身不是ActiveRecord模式的实现。在Fowler的ActiveRecord模式的真正实现中,对象本身将负责从数据库中保存和加载其状态。当使用Linq to SQL对象时,DataContext负责数据库检索、跟踪对象状态,并将这些更改保存回数据库。

    将这些linq-to-sql类包装在更多的代码中很难使其成为ActiveRecord模式的真正实现(没有简单的方法可以从DataContext中承担责任)。

        3
  •  2
  •   jrista    16 年前

    linq to sql不是的实现 Active Record 这意味着实体完全有责任管理自己的持久性(即感知持久性)。Linq to SQL实际上是 Unit of Work . 工作单元意味着某种类型的注册表或上下文可以隐式或显式地跟踪实体的状态,从而允许实体完全不知道其持久性机制(即持久性不知道)。

    工作单元支持一种称为poco(普通的旧clr对象)的编程风格,这有助于维护 separation of concerns 并保持 principle of single responsibility . 当满足这两个原则时,您的软件通常更容易维护。活动记录实际上会破坏这两个主体,导致更紧密耦合的软件更难维护。