LINQ to SQL实现数据访问通用基类(续)

在我们基于Domain驱动模式开发面向对象的多层架构的时候,层和层之间数据的传输对象(DTO)往往 简化为领域对象模型,在上文中就是我们利用LINQ TO SQL对象设计器生成的Bill,Customer等实体类。

存在的问题

通常的做法,我们把这些实体类单独分成一层,这样程序分层划分成如下:

数据访问层(Data Access Layer)

业务层 (Business Layer)

用户界面层(UI Layer)

实体层(Entity Layer)

注意,多层应用程序,一般遵守这样的规则:UI调用BL,BL调用DL,不能跨级调用,也不能底层调用 上层,但是实体层是我们的DTO,各个层都可以调用它。

如果这样划分,我们系统就出现问题:

我们把RepositoryBase划到数据层,LINQ TO SQL对象设计器生成的类分到实体层,数据层引用实体层 ,没有问题,但是我们看到,在我们实体层,存在一个方法(以Bill为例):

public static RepositoryBase<Bill, LINQtoSQLHelper.DataContextSetUp> CreateRepository() { return new BillRepository(); }

数据层也必须引用数据访问层,循环引用。另外,对于如何体现loadoption那?

解决循环引用

以Bill实体为例,循环引用的病因在于Bill实体中添加这样一个方法:

public static RepositoryBase<Bill, LINQtoSQLHelper.DataContextSetUp> CreateRepository() { return new BillRepository(); }

为什么要添加这个方法那?这样做就是充血模式的实体了。注意到RepositoryBase.cs有一段代码:

try
{
    object Repository = association.OtherType.Type.GetMethod("CreateRepository").Invoke (null, null);
    Repository.GetType().GetMethod("IterateEntitySet",
                                 BindingFlags.NonPublic | BindingFlags.Instance).Invoke(
        Repository,
        new object[4]
        {
            AssociationProperty.GetValue(theEntity, null),
            context,
            OperationMode,
            Recursively
        }
        );
}
catch (System.Reflection.TargetInvocationException e)
{
    throw (e.InnerException);
}

时间: 2024-10-03 15:06:46

LINQ to SQL实现数据访问通用基类(续)的相关文章

LINQ to SQL实现数据访问通用基类

LINQ to SQL让人着迷,在.Net应用程序当中,.它提供了一种安全,强大和非常灵活的方式执行数据 访问,在当前微软传道者介绍上看,很容易上手. 不幸的是,当你对LINQ进行仔细研究后,我发现在多层架构中使用LINQ的并不是十分容易. 本文介绍用LINQ to SQL实现数据层的典型的问题点 ,并提供了一个简单,方便和灵活的方式来克服 它们. 本文附带的LING to SQL 实现数据访问通用类有以下的特点: 实现了存储库模式,你可以用不到10行代码执行LINQ实体类型的CRUD (Cre

asp.net 数据访问层基类_实用技巧

部分代码: 复制代码 代码如下: using System; using System.Collections; using System.Collections.Specialized; using System.Data; using System.Data.SqlClient; using System.Configuration; using System.Data.Common; using System.Collections.Generic; namespace sosuo8.DB

linq to sql修改数据数据库不更新

问题描述 linq to sql修改数据数据库不更新 代码执行,就是不更新 DataClasses3DataContext db = new DataClasses3DataContext(); gongzi h = new gongzi(); var results = from r in db.gongzi where r.用户ID == Label5.Text && r.时间 == Convert.ToDateTime(Label6.Text) select r; if (resul

SQL Server数据访问程序优化指南

经过紧张的调查,你发现问题出在数据库上,当应用程序尝试访问/更新数据时,数据库执行得相当慢,再次深入调查数据库后,你发现数据库表增长得很大,有些表甚至有上千万行数据,http://www.aliyun.com/zixun/aggregation/8531.html">测试团队开始在生产数据库上测试,发现订单提交过程需要花5分钟时间,但在网站上线前的测试中,提交一次订单只需要2/3秒. 类似这种故事在世界各个角落每天都会上演,几乎每个开发人员在其开发生涯中都会遇到这种事情,我也曾多次遇到这种

Linq to SQL 插入数据时的一个问题_MsSql

复制代码 代码如下: create table RSSFeedRight ( FeedId int Foreign Key (FeedId) References RSSFeed(FeedId) NOT NULL , -- FeedId , UserId int Foreign Key (UserId) References UserInfo(UserId) NOT NULL , -- UserId , RightValue bigint NOT NULL Primary key (UserId

Linq to SQL 插入数据时的一个问题

复制代码 代码如下:create table RSSFeedRight ( FeedId int Foreign Key (FeedId) References RSSFeed(FeedId) NOT NULL , -- FeedId , UserId int Foreign Key (UserId) References UserInfo(UserId) NOT NULL , -- UserId , RightValue bigint NOT NULL Primary key (UserId,

linq to sql submitchanges数据不更新的问题

问题描述 publicMain(){InitializeComponent();}DataClassesDataContexta=newDataClassesDataContext();privatevoidMain_Load(objectsender,EventArgse){bindingSource1.DataSource=a.Table;}privatevoidbutton1_Click(objectsender,EventArgse){ChangeSetchangeSet=a.GetCh

Asp.Net Oracle数据的通用操作类_实用技巧

在一个项目中,可能用到2种数据,比如说ORACLE ,MS_SQLSERVER 同时要用到,MS-SQL的数据通用类在很多的教程中都有现成的例子和代码,但是ORACLE比较少见,但是本次项目中正好用到,贴出来和大家一起共享. 这里用OraDbHelper.cs做常见的四种数据操作 一 ExecuteDataTable 返回到内存数据表 二 SqlDataReader 直接读数据 三 ExecuteScalar 获得一条数据 四 ExecuteNonQuery 对数据库执行增删改操作 环境:客户端

业务逻辑层如何导入数据访问层的类

问题描述 我自己做的一个论坛 UI直接放在网站里面 在解决方案上新建了Business工程和Data工程 里面分别有业务逻辑的类和数据访问的类 但是因为我把一些封装的数据放在app_code使得Business和Data里访问不了 还有Business下的命名空间引用不了Data下命名空间的Database.cs类询问以下哪一快出问题了 解决方案 解决方案二:你的Data命令空间是否和系统的System.Data有冲突?解决方案三:using