Castle ActiveRecord学习实践(1):快速入门指南

摘要:最近几天有时间看了一下Castle,原来它的功能是如此的强大,从数据访问框架到IOC容器,再到WEB框架,基本包括了整个开发过程中的所有东西,看来得好好学习研究一下了,并且打算把自己学习过程的一些东西记录下来。先从ActiveRecord开始吧,ActiveRecord提供的简洁的O/R映射给我留下了很深的印象,本文将通过一个简单对象的CRUD操作来带你快速走进Castle ActiveRecord

主要内容

1.概述

2.准备相关的数据表

3.编写User实体类

4.构建配置信息

5.开始CRUD操作

6.使用ActiveRecord Generator生成实体类代码

 

一.概述

如果你用过NHibernate,一定会对在NHibernate中编写.hbm.xml文件印象深刻,我也是。而在Castle ActiveRecord中,我们不用再为编写繁冗复杂的映射文件而头疼,ActiveRecordCastle中提供的一个数据访问框架,它在底层封装了NHibernate的操作,使用特性来代替映射文件,它提供的简洁的O/R映射会让你惊叹原来实现持久化数据层是那么简单。下面我们通过一个简单对象的CRUD操作来快速进入Castle ActiveRecord

 

二.准备相关的数据表

假定数据库中有这样一张用户表,用来保存用户的信息,如下

CREATE TABLE [dbo].[Users] (
    
[LogonID] [int] IDENTITY (11NOT NULL ,
    
[LogonName] [varchar] (40) COLLATE Chinese_PRC_CI_AS NULL ,
    
[Password] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
    
[EmailAddress] [varchar] (40) COLLATE Chinese_PRC_CI_AS NULL ,
    
[LastLogon] [datetime] NULL 
ON [PRIMARY]
GO


三.编写User实体类

首先我们新建一个User类并让它继承于ActiveRecordBase

public class User : ActiveRecordBase

{

    
//

}


User类添加特性,其实就是告诉ActiveRecordUser类所对应的数据库中的数据表名为Users

[ActiveRecord("Users")]
public class User : ActiveRecordBase
{
    
//
}


下面我们的工作就是为实体类添加属性

[ActiveRecord("Users")]
public class User : ActiveRecordBase
{
    
private int _id;

    
private string _name;

    
private string _password;

    
private string _emailAddress;

    
private DateTime _lastLogon;

    [PrimaryKey(PrimaryKeyType.Identity, 
"LogonID")]
    
public int Id
    
{
        
get return _id; }
        
set { _id = value; }
    }

    
    [Property(
"LogonName")]
    
public string Name
    
{
        
get return _name; }
        
set { _name = value; }
    }

    
    [Property(
"Password")]
    
public string Password
    
{
        
get return _password; }
        
set { _password = value; }
    }

    
    [Property(
"EmailAddress")]
    
public string Address
    
{
        
get return _emailAddress; }
        
set { _emailAddress = value; }
    }

    
    [Property(
"LastLogon")]
    
public DateTime LastLogon
    
{
        
get return _lastLogon; }
        
set {_lastLogon = value; }
    }

}


大家可能注意到了,每一个属性上面都加上了特性[Property()]。简单的说明一下,这里用[PrimaryKey]特性指定Id作为主键,并且说明了主键的类型为自增型的,用PrimaryKeyType.Identity来说明,在后续文章中我会详细说明的。如果属性名和字段名一致,[Property()]中可以为空,也可以写上字段的名字。

下一步我们为实体类根据需要加上静态的操作方法,至于Create()Update()Delete()Save()等方法则会直接从ActiveRecordBase基类中继承

[ActiveRecord("Users")]
public class User : ActiveRecordBase
{
    
//……

    
public static void DeleteAll()
    
{
        DeleteAll( 
typeof(User) );
    }


    
public static IList FindAll()
    
{
        
return (IList) FindAll( typeof(User) );
    }


    
public static User Find(int id)
    
{
        
return (User) FindByPrimaryKey( typeof(User), id );
    }

}

 

整个完成后的实体类代码

using System;
using System.Collections;
using Castle.ActiveRecord;

namespace ARDemo
{
    
/// <summary>
    
/// User 的摘要说明。
    
/// </summary>

    [ActiveRecord("Users")]
    
public class User : ActiveRecordBase
    
{
        
private int _id;

        
private string _name;

        
private string _password;

        
private string _emailAddress;

        
private DateTime _lastLogon;

        [PrimaryKey(PrimaryKeyType.Identity, 
"LogonID")]
        
public int Id
        
{
            
get return _id; }
            
set { _id = value; }
        }

        
        [Property(
"LogonName")]
        
public string Name
        
{
            
get return _name; }
            
set { _name = value; }
        }

        
        [Property(
"Password")]
        
public string Password
        
{
            
get return _password; }
            
set { _password = value; }
        }

        
        [Property(
"EmailAddress")]
        
public string Address
        
{
            
get return _emailAddress; }
            
set { _emailAddress = value; }
        }

        
        [Property(
"LastLogon")]
        
public DateTime LastLogon
        
{
            
get return _lastLogon; }
            
set {_lastLogon = value; }
        }


        
public static void DeleteAll()
        
{
            DeleteAll( 
typeof(User) );
        }


        
public static IList FindAll()
        
{
            
return (IList) FindAll( typeof(User) );
        }


        
public static User Find(int id)
        
{
            
return (User) FindByPrimaryKey( typeof(User), id );
        }

    }

}

 

四.构建配置信息

现在我们要告诉ActiveRecord相关的数据库、数据驱动等信息,最简单的就是使用配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    
<configSections>
        
<section name="activerecord" type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord" />
    
</configSections>
    
<activerecord>
        
<config>
            
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
            
<add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2000Dialect" />
            
<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
            
<add key="hibernate.connection.connection_string" value="UID=sa;Password=sa;Initial Catalog=ARDemo;Data Source=." />
        
</config>
    
</activerecord>
</configuration>


用过NHibernate的朋友一定会对这段配置代码很熟悉,没错,因为ActiveRecord在底层封装了NHibernate,所以这里的配置跟使用NHibernate时的配置一样,同样是指定了数据源驱动,连接字符串等信息。如果使用了配置文件在代码中只要这样去初始化就可以了

IConfigurationSource source = System.Configuration.ConfigurationSettings.GetConfig("activerecord"as IConfigurationSource;
ActiveRecordStarter.Initialize( source, 
typeof(User) );


我们也可以不使用配置文件,而使用代码指定的方式,但是由于这种方式相当于硬编码了,不大推荐大家使用这种方式:

InPlaceConfigurationSource source = new InPlaceConfigurationSource();

Hashtable properties 
= new Hashtable();

properties.Add(
"hibernate.connection.driver_class""NHibernate.Driver.SqlClientDriver");
properties.Add(
"hibernate.dialect""NHibernate.Dialect.MsSql2000Dialect");
properties.Add(
"hibernate.connection.provider""NHibernate.Connection.DriverConnectionProvider");
properties.Add(
"hibernate.connection.connection_string""UID=sa;Password=19811218;Initial Catalog=ARDemo;Data Source=.");

source.Add( 
typeof(ActiveRecordBase), properties );

ActiveRecordStarter.Initialize( source, 
typeof(User) );

 

五.开始CRUD操作

好了,经过了前面的步骤之后,就可以正式开始我们的对象CRUD操作了。

1.增加User对象

[Test]
public void AddUser()
{
    User user 
= new User();

    user.Name 
= "Terrylee";
    user.Password 
= "aaa";
    user.Address 
= "lhj_cauc@163.com";
    user.LastLogon 
= DateTime.Now;
    
    user.Create();
}


是不是非常简单?我们甚至都没有写过Create()方法,它直接从ActiveRecordBase类继承。我们所做的只是创建这样一个User对象,然后调用它的方法就可以了。

2.查询所有的User对象

[Test]
public void FildAll()
{
    IList list 
= User.FindAll();

    Assert.IsNotNull(list);

    
int actual = list.Count;
    
int expected = 2;

    Assert.AreEqual(expected,actual);
}


3.查询某一个指定IdUser对象

[Test]
public void Fild()
{
    
int id = 5;
    User actual 
= User.Find(id);

    Assert.IsNotNull(actual);
    Assert.AreEqual(
"Terrylee",actual.Name);
    Assert.AreEqual(
"aaa",actual.Password);
}


4.修改User对象

[Test]
public void UpdateUser()
{
    User user 
= new User();

    user.Id 
= 5;
    user.Name 
= "Aero";
    user.Password 
= "aaa";
    user.Address 
= "chwkai@163.com";
    user.LastLogon 
= DateTime.Now;

    user.Update();
}


5.删除User对象

[Test]
public void DeleteUser()
{
    User user 
= new User();

    user.Id 
= 7;
    user.Delete();
}


6.删除所有的User对象

[Test]
public void DeleteAll()
{
    User.DeleteAll();
}


可以看到,整个过程非常的简洁简单,没有一点多余复杂的代码,相信你已经开始体会到了ActiveRecord的魅力了。唯一有一点你会感到不舒服的是已经有了数据库表还需要手工编写实体类代码,这个不用担心,ActiveRecord已经为我们提供了代码生成工具ActiveRecord Generator

六.使用ActiveRecord Generator生成实体类代码

1.执行Castle.ActiveRecord.Generator.exe,位于目录C:\Program Files\Castle\Bin\net-1.1\下面,可以看到如下界面,选择Project Explorer面板

 

2.点击“Add DataBase Connection”图标,如下图中红色方框所示,弹出设置连接字符串对话框,我们首先要为数据库起一个别名,这个名字可以跟数据库名不一样,在后面我们会用到

 

注意:如果连接数据库为SQL Server2000数据库,必须在弹出的对话框中选中允许保存密码选项,否则点击OK按钮时会报登录失败的错误!这点不知道是不是我机器的设置问题,如果有朋友遇到这样的错误,不妨一试。

 

3.点击OK后,选择ActiveRecord Components面板

 

 

 

4.拖动ActiveRecord到左边的空白区域,会出现如下界面,选择我们刚才设置的数据库别名

 

5.此后操作有选择子段,设置类名等,全部完成后界面如下:

 

6.选择Project菜单下的Generate Code,输入命名空间,文件设置路径,并选择所要生成代码语言

注意:有一个选项是否覆盖已经存在的文件,可以根据自己的实际情况选择

7.最后生成的完整实体类代码如下

// 
// Generated by ActiveRecord Generator
// 
//
namespace ARDemo
{
    
using Castle.ActiveRecord;
    
    
    [ActiveRecord(
"Users")]
    
public class User : ActiveRecordBase
    
{
        
        
private int _logonID;
        
        
private string _logonName;
        
        
private string _password;
        
        
private string _emailAddress;
        
        
private System.DateTime _lastLogon;
        
        [PrimaryKey(PrimaryKeyType.Native)]
        
public int LogonID
        
{
            
get
            
{
                
return this._logonID;
            }

            
set
            
{
                
this._logonID = value;
            }

        }

        
        [Property()]
        
public string LogonName
        
{
            
get
            
{
                
return this._logonName;
            }

            
set
            
{
                
this._logonName = value;
            }

        }

        
        [Property()]
        
public string Password
        
{
            
get
            
{
                
return this._password;
            }

            
set
            
{
                
this._password = value;
            }

        }

        
        [Property()]
        
public string EmailAddress
        
{
            
get
            
{
                
return this._emailAddress;
            }

            
set
            
{
                
this._emailAddress = value;
            }

        }

        
        [Property()]
        
public System.DateTime LastLogon
        
{
            
get
            
{
                
return this._lastLogon;
            }

            
set
            
{
                
this._lastLogon = value;
            }

        }

        
        
public static void DeleteAll()
        
{
            ActiveRecordBase.DeleteAll(
typeof(User));
        }

        
        
public static User[] FindAll()
        
{
            
return ((User[])(ActiveRecordBase.FindAll(typeof(User))));
        }

    }

}


大家还应该注意的一点是生成One-Many/Many-One等关系的实体类文件时可能会出现一些问题,需要对生成的代码手工改动。最后希望和研究Castle的朋友能够多多交流!

 

参考资料

Castle的官方网站http://www.castleproject.org

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2006-04-03 16:59 TerryLee 阅读(61229) 评论(177) 编辑 收藏

评论共2页: 上一页 1 2 
 回复 引用   
#77楼 2006-09-08 10:51 hongyanlai[未注册用户]
@TerryLee
我主键已经设置了Assigned,可还是不行,错误信息如下:myDaVinci.Dal.Test.SiteSettingTest.SaveSiteSetting : Castle.ActiveRecord.Framework.ActiveRecordException : Could not perform Save for SiteSetting
----> NHibernate.HibernateException : SQL insert, update or delete failed (expected affected row count: 1, actual affected row count: 0). Possible causes: the row was modified or deleted by another user, or a trigger is reporting misleading row count.

 回复 引用 查看   
#78楼[楼主] 2006-09-08 16:49 TerryLee      
@hongyanlai
把你的代码贴出来看一下吧,这样看不出来

 回复 引用   
#79楼 2006-09-20 15:49 lizheng[未注册用户]
TerryLee,我想请教一下,我没用过Hibernate
是不是在学习Castle之前要先学习hibernate才行?
还有,那个ActiveRecordGenerate 在哪里下载?

 回复 引用 查看   
#80楼[楼主] 2006-09-20 16:51 TerryLee      
@lizheng
你说的应该是NHibernate,而不是Hibernate。不需要,但是如果对NHibernate熟悉一些,掌握起来会更快

ActiveRecordGenerator在下载后的源码中就有

 回复 引用   
#81楼 2006-09-28 17:05 lizheng[未注册用户]
谢谢,我经过这几天的研究,也逐渐的了解了一些
但是还是有很多疑问。。。
不知道你方不方便告诉我你的邮箱,我想把问题整理一下(不会太多的,不会耽误你太长时间),希望你能简单的帮我解答一下,也希望能跟高手多交流一下
如果是qq或msn都可以
当然,如果不方便也没关系。。呵呵
我的邮箱:lizheng@51testing.com
qq:66238953
msn:lizheng__114@hotmail.com

 回复 引用   
#82楼 2006-09-29 17:08 codelover[未注册用户]
.net开源框架qq群30017484,讨论Castle ActiveRecord、Nhibernate、ibatisnet、IOC容器Spring.Net和Castle等框架
 回复 引用 查看   
#83楼[楼主] 2006-10-06 17:25 TerryLee      
@lizheng
晕死了,我的邮箱在Blog右边有啊

 回复 引用   
#84楼 2006-10-22 17:21 wang[未注册用户]
好文章啊,上面 "2.查询所有的User对象 FindAll()方法"
中的这几句代码什么意思啊

Assert.IsNotNull(list);

int actual = list.Count;
int expected = 2;

Assert.AreEqual(expected,actual);
谢谢

 回复 引用 查看   
#85楼[楼主] 2006-10-22 17:52 TerryLee      
@wang
使用NUnit做单元测试

 回复 引用   
#86楼 2006-11-13 17:55 plowman[未注册用户]
简单的才是最好的,Castle这些东西 学习还可以,用的话就别了.
 回复 引用 查看   
#87楼[楼主] 2006-11-13 18:04 TerryLee      
@plowman
建议你先去了解一下再来发言!

Castle中的AR,IOC都是很优秀的,我现在在小项目中也有应用

 回复 引用   
#88楼 2006-11-30 09:07 lovebanyi[未注册用户]
想知道分页如何做. 如果用findAll不太好吧
 回复 引用   
#89楼 2006-12-03 23:19 简凡[未注册用户]
请问,我把主键ID设为Assigned在使Save();时如何将ID负值为GUID.newGUID().TOstring();
 回复 引用 查看   
#90楼[楼主] 2006-12-03 23:42 TerryLee      
@简凡
Assigned是让应用程序在自己为对象分配一个标示符,在使用时直接指定ID

// 既然是GUID,为什么不把主键类型设置为GUID,而要设置成Assigned呢?

 回复 引用   
#91楼 2006-12-13 16:04 qcrsoft[未注册用户]
照着楼主的指点做了,web可以过,改成WinForm,就不行了

建了一个Castle ActiveRecord Project,然后另做了一个“windows 应用程序”project里测试它,在测试项目里引用了
Castle,ActiveRecord
Castle.Core
NHibernate

然后写了以下代码:
private void Form1_Load(object sender, EventArgs e)
{
Castle.ActiveRecord.Framework.Config.InPlaceConfigurationSource source = new Castle.ActiveRecord.Framework.Config.InPlaceConfigurationSource();

System.Collections.Hashtable properties = new System.Collections.Hashtable();

properties.Add("hibernate.connection.driver_class", "NHibernate.Driver.SqlClientDriver");
properties.Add("hibernate.dialect", "NHibernate.Dialect.MsSql2000Dialect");
properties.Add("hibernate.connection.provider", "NHibernate.Connection.DriverConnectionProvider");
properties.Add("hibernate.connection.connection_string", "UID=sa;Password=qqq;Initial Catalog=dh6;Data Source=.");

source.Add(typeof(Castle.ActiveRecord.ActiveRecordBase), properties);
Castle.ActiveRecord.ActiveRecordStarter.Initialize(source, typeof(yifei.User));

mynamespace.User[] user = mynamespace.User.FindAll(); //这一行报could no perform FindAll for User
}

可能是哪里错了?感激涕零!

 回复 引用   
#92楼 2006-12-13 16:08 qcrsoft[未注册用户]
另外请问李兄弟,WinForm程序能不能也象Web那样把数据库配置写在web.config那样写在某个配置文件里呢?
 回复 引用   
#93楼 2006-12-13 16:23 qcrsoft[未注册用户]
在第2讲里找到从xml里加载配置信息的方法了,感激涕零!
不过上上个问题还是没解决,痛哭流涕

 回复 引用   
#94楼 2006-12-13 16:29 qcrsoft[未注册用户]
另外我如果吧
Initialize(source, typeof(mynamespace.User));
改成
Initialize(source, typeof(ActiveRecord));
错误信息就会提示为:
You have accessed an ActiveRecord class that wasn't properly initialized. The only explanation is that the call to ActiveRecordStarter.Initialize() didn't include mynamespace.User class

啥意思捏

 回复 引用 查看   
#95楼[楼主] 2006-12-13 20:13 TerryLee      
@qcrsoft
使用App.config配置文件

直接用Initialize(source, typeof(User)); 试试

 回复 引用   
#96楼 2006-12-14 17:15 ycl[未注册用户]
使用特性是不是和EJB3.0的思想。
 回复 引用 查看   
#97楼[楼主] 2006-12-14 23:55 TerryLee      
@ycl
对EJB我不了解啊

 回复 引用   
#98楼 2006-12-15 16:43 Jove[未注册用户]
TerryLee 兄:
 
在目录C:\Program Files\Castle\Bin\net-1.1\下没找到文件Castle.ActiveRecord.Generator.exe,我重新安装了一次,还是没有,我是从官方网站下载的castleproject-1.0-rc2.msi安装的,大小11.7MB。

不知道咋回事儿。

 回复 引用   
#99楼 2006-12-15 16:46 Jove[未注册用户]
对了,我安装好后,是目录:C:\Program Files\CastleProject\Bin\net-1.1\而不是C:\Program Files\Castle\Bin\net-1.1\

可能是版本的问题吧

 回复 引用 查看   
#100楼[楼主] 2006-12-15 21:08 TerryLee      
@Jove
在最新的RC 版本中没有这个生成器

 回复 引用   
#101楼 2006-12-17 22:15 qcrsoft[未注册用户]
我也遇到了Jove 的问题也找不到Castle.ActiveRecord.Generator.exe,不过我存在1.0和2.0两个目录,应该是TerryLee说的问题。另外最新版的为什么不提供这个exe咛,那做库表的xml映射手写累翘翘啊
 回复 引用 查看   
#102楼[楼主] 2006-12-18 23:44 TerryLee      
@qcrsoft
有人正在开发一个AR的生成实体类的VS.NET插件,且已经成型,估计将来官方推荐的应该是它,有空我介绍一下这个东东:)

 回复 引用 查看   
#103楼[楼主] 2006-12-20 09:09 TerryLee      
@Jove
链接路径太长,影响了版面,我先删除了……

 回复 引用   
#104楼 2006-12-20 15:09 Jove[未注册用户]
@TerryLee

呵呵,确实太长,没关系。

 回复 引用   
#105楼 2006-12-22 18:11 qcrsoft[未注册用户]
楼主,你说的那个生成那个生成实体类的工具往上有没有预览版什么的可下啊,叫啥名字
 回复 引用   
#106楼 2006-12-23 00:57 qcrsoft[未注册用户]
ActiveRecord调试几个总结
1、连接SQL SERVER 2005墨有问题,连接串和楼主写的例子中连接SQL SERVER2000一样

2、库里有个user表,写了个对应的User类,运行总提示“User附近有语法错误”,折腾了两个多小时,总算找到原因,敢情是NHibernate内部想必没对user做处理,对这样关键字应该加[user]的,没试其他关键字如order行不行,八成是不行,所以大家用activeRecord和NHibernate只行放弃user这样的表名。不爽。

3、我是在代码(asp.net)中用下面两行做ActiveRecord初试划的
IConfigurationSource source = System.Configuration.ConfigurationSettings.GetConfig("activerecord") as IConfigurationSource;
ActiveRecordStarter.Initialize( source, typeof(User) );

第一下可以运行成功,一刷新就提示“You can't invoke ActiveRecordStarter.Initialize more than once”,一时不明白more than once是什么意思,后来一查,敢情这三单词凑在一起是个词组,“不止一次”的意思,豁然开朗,看来这两行的放在application_onstar里去

 回复 引用 查看   
#107楼[楼主] 2006-12-23 16:14 TerryLee      
@Jove
:)

 回复 引用 查看   
#108楼[楼主] 2006-12-23 16:16 TerryLee      
@qcrsoft
名字没记住,我改天找一下,写篇文章介绍一下,请稍等:)

 回复 引用 查看   
#109楼[楼主] 2006-12-23 16:19 TerryLee      
@qcrsoft
多谢补充

2.在数据库中,一般是没人用user这个表名的,我想大多数人都会用Users

3.放在ASP.NET中不是个明智的做法,所以还是得放在Application_Start里面

 回复 引用   
#110楼 2006-12-23 16:41 qcrsoft[未注册用户]
今天一天都在学习ActiveRecord,被几个绊子拖着进度很慢,上面总结了一点,现在再继续,希望对后来的兄弟有点用不要象我这么耗费时间:

照着李楼主的
public static void DeleteAll()
{
  ActiveRecordBase.DeleteAll(typeof(User));
}
敲,ActiveRecordBase后面无论如何找不到DeleteAll这个方法,后来终于试出写成
ActiveRecordBase<User>.DeleteAll();
才可,看样是新版本的Castle支持泛型而做了修改(我下的版本是Castle站上标本标记为“Release Candidate 2 - November 1st, 2006”的包)。

因此想到申明类时直接写为
public class User : ActiveRecordBase<User>
程序里牵扯到User类型的地方都可以简化,比如上面的改成
ActiveRecordBase.DeleteAll();

还有
(User)FindByPrimaryKey(typeof(User), id);
可以只需要写成
FindByPrimaryKey(id);

IList list = (IList)FindAllByProperty(typeof(User), "Username", username);
可以写成
User[] user = FindAllByProperty("Username", username);

清爽了许多,由此再次验证了泛型的无比优越性!

 回复 引用   
#111楼 2006-12-23 16:48 qcrsoft[未注册用户]
(也算是题外话)
我倒看过一篇数据库命名规范的建议,说到不要用s来起名,比如
users
memebers
books
等等都是不被建议的,而且在实践中我也感觉到这个建议是好的。关于数据库设计我有一点心得,有空是写篇帖子发你审审改改,好的话回复在你BLOG里,希望能对大家伙有点用。
象你学习,为人民服务!

 回复 引用   
#112楼 2006-12-23 16:53 qcrsoft[未注册用户]
饿读楼主的文章,一天没吃饭,我棵,要饿死了,下了下了,可算能看下一篇了,回头再来,祝楼主和读友们圣诞快乐
 回复 引用 查看   
#113楼[楼主] 2006-12-23 17:49 TerryLee      
@qcrsoft
好啊,但是看微软提供的示例数据库都会用s,呵呵

比如数据表名为Users,实体类也许就是User,期待你的文章:)

 回复 引用 查看   
#114楼[楼主] 2006-12-23 17:50 TerryLee      
@qcrsoft
感动啊:)

也祝你圣诞快乐!

//明天我还有个微软的培训,没想到今年的圣诞节这样过,唉……

 回复 引用   
#115楼 2006-12-25 18:08 qcrsoft[未注册用户]
楼主啊,偶来向你请教:
我想把ActiveRecord封装进我的数据访问层里,以一个DLL文件供WEB、WinForm等不同的项目访问,但是这样做的话如何做等同WEB下那个Application_Start里的初始化工作呢?
想来想去不得解,劳驾您给点拨一下那!

 回复 引用 查看   
#116楼[楼主] 2006-12-25 21:19 TerryLee      
@qcrsoft
如果是WinForm,需要在程序入口点进行初始化

 回复 引用   
#117楼 2006-12-25 23:43 qcrsoft[未注册用户]
我这是个DLL可怎么办咛?
这个类库实际上就上把你例子里的User类们封装了一下,我想Dll自己来完成activeRecord的初始化工作,而不是调用端去做完成

 回复 引用 查看   
#118楼 2006-12-26 15:34 yf_zq      
有一个问题想请教:
如何使用多数据库.

 回复 引用   
#119楼 2006-12-26 17:28 qcrsoft[未注册用户]
TO 楼上
http://www.cnblogs.com/wj/archive/2005/07/10/189924.aspx
这里有一段是在xml配置多个数据库连接的,不知合不合你的用。我在收藏夹里有个BLOG个链接是专门说使用多个数据库的,可是混在一起找不到了,你凑合看一下上面这个

 回复 引用   
#120楼 2006-12-26 18:56 qcrsoft[未注册用户]
楼主和读楼主文章的兄弟们给我指点一下啊:
为了学习ActiveRecord,我准备做个小程序,供我跟我老婆通过Web、Pocket PC两种方式记每日消费的流水帐,我这么规划的:
1、
建个类库封装各个实体类(这个名词用的准确吗?),就是楼主文章里的User类等,这些类提供CRUD操作。这一层算不算数据访问层?
2、
再建一个类库封装N个类负责诸如口令验证(对上提供验证函数、通过1里面的类访问数据)、消费记录、汇总数据等。这一层算是业务逻辑层吧?
3、
Web项目,调用2里的类,这算是表现层是吧?
4、
建一个Web Services项目,对手机端提供Web服务,向下调用2里的类。(这一层算什么呢?)
5、
建Pocket Pc项目,跑在手机上,通过4访问系统。(这层算什么呢?也算表现层?)
以上分的合不合理?层的叫法有没有问题?

 回复 引用   
#121楼 2006-12-27 19:00 qcrsoft[未注册用户]
请教众家兄弟一个问题:
例子中User这个类提供CRUD相关操作,那修改密码这个功能设计在什么地方比较合适?

 回复 引用   
#122楼 2006-12-28 16:43 qcrsoft[未注册用户]
TO yf_zq
使用多数据库的那篇文章找到了,在
http://www.agilelabs.cn/blogs/linkin/archive/2006/05.aspx
第一篇就是

 回复 引用 查看   
#123楼 2007-01-08 22:40 yf_zq      
TO qcrsoft:
非常感谢您.

 回复 引用   
#124楼 2007-01-11 15:14 qcrsoft[未注册用户]
紧密围绕在以terrylee为核心的TerryLee's Tech Space周围,努力学习互相帮助
 回复 引用 查看   
#125楼 2007-02-09 16:16 cloud      
你好,请问我怎么找不到Castle.ActiveRecord.Generator.exe?

 回复 引用   
#126楼 2007-02-14 18:08 luckass[未注册用户]
Castle.ActiveRecord.Generator.exe在哪里能找到
 回复 引用   
#127楼 2007-02-26 14:17 row[未注册用户]
@qcrsoft

你的問題我也很想知道

 回复 引用   
#128楼 2007-03-07 09:29 blindcat[未注册用户]
我也没找到Castle.ActiveRecord.Generator.exe
bin/下只有Castle.MonoRail.Generator.exe
谁有Castle.ActiveRecord.Generator.exe是不是能提供下载一下

 回复 引用   
#129楼 2007-03-07 10:30 blindcat[未注册用户]
Castle.ActiveRecord.Generator.exe,我想大家可以从源码里编译
只不过我刚开始学.net,用的是Vs2005,出现一堆一堆的问题:(,很郁闷

 回复 引用   
#130楼 2007-03-07 14:27 blindcat[未注册用户]
Net1.1版本的Castle.ActiveRecord.Generator.exe供大家下载
http://www.worm168.com/down/Castle-bin-net-1[1].1.zip

 回复 引用   
#131楼 2007-03-30 14:05 mingxingw[未注册用户]
@LeonMorris
这个问题应该怎么解决呢!请赐教!!!!!

 回复 引用   
#132楼 2007-04-10 18:28 good[未注册用户]
请加入QQ群12923729,开源的世界讨论!
 回复 引用   
#133楼 2007-04-16 14:33 一凡[未注册用户]
这个哪里有下载呀
 回复 引用 查看   
#134楼 2007-04-23 13:58 Kevin Wu      
我下载的是1.0 Release Candidate 2 - November 1st, 2006
版本,里面的ActiveRecord是RC1,但是在里面没有找到Castle.ActiveRecord.Generator.exe这个文件,为什么呢?

 回复 引用   
#135楼 2007-05-18 09:59 Payne[未注册用户]
@kiler

同意!
其实最主要的还是性能的考虑。

 回复 引用   
#136楼 2007-06-04 10:54 handianyixin[未注册用户]
我创建的是控制台应用程序,在Main函数中初始化,
static void Main(string[] args)
{
IConfigurationSource source = ConfigurationManager.GetSection("activerecord") as IConfigurationSource;
ActiveRecordStarter.Initialize(source, typeof(Login));
}
总是报错说,找不到类型或命名空间名称Login(是否缺少using指令或程序集引用)
实际上启动程序和Login在同一个命名空间namespace ConCastle 它的下面,
渴望得到高人指点. 我的Email:wangqiaoli649@sina.com,先谢谢各位了!

 回复 引用   
#137楼 2007-06-12 17:15 yolanda[未注册用户]
请问,如何执行test,我专门建立了usertest.cs类,把test方法都放在这个类中。用nunit测试,就会出现activerecordstarter没有initialize的错误。但是,直接执行程序是没有错误的呀!我的activeRecord 的initialize的操作是放在global.asax的application_start中的
 回复 引用   
#138楼 2007-06-13 09:51 king2003[未注册用户]
不喜欢ActiveRecord这种把数据操作方法和业务实体写在一起的方式,这种方式写多个实体更新的事务比较麻烦。我也有同感
 回复 引用   
#140楼 2007-06-22 14:40 mp3che[未注册用户]
有原代码吗? 提供下载吧! 给大家看看吧!
 回复 引用   
#141楼 2007-06-29 16:23 zjw[未注册用户]
查询的时候 Assert 个对象是从哪来的
 回复 引用   
#142楼 2007-08-03 16:11 firedemoning[未注册用户]
下面代码中我把lastLogon注释掉,为什么就会出错
public void AddUser()
{
User user = new User();

user.Name = "Terrylee";
user.Password = "aaa";
user.Address = "lhj_cauc@163.com";
// user.LastLogon = DateTime.Now; //注释掉,调试出错

user.Create();
}

 回复 引用   
#143楼 2007-08-03 17:23 firedemoning[未注册用户]
使用ActiveRecord框架是不是,数据库中的表一定要用主键.

不然好像会出错.

 回复 引用   
#144楼 2007-09-01 12:07 ttt[未注册用户]
写的好 写的好
 回复 引用   
#145楼 2007-10-16 10:43 风中劲草[未注册用户]
请问下Castal里怎么调用存储过程啊 ?
 回复 引用   
#146楼 2007-12-15 15:02 kjwhzx[未注册用户]

网络心理咨询;首次咨询可先咨询后付款
为需要心理帮助的朋友解决工作、社交、教育、家庭、婚恋等心理问题,缓释心理压力、化解心理冲突、处理负面情绪、调整心理状态、提高社会适应力;不受理人格障碍、精神疾病患者以及各种危机状态求助者。
1、专业心理咨询;网络\电话心理咨询,每次30至50分钟;单次每次50元;三次以上每次35元。
2、会员加入方式:付费咨询三次后,即升级为会员,可享受每次咨询35元的优惠价格;一次预付三次咨询费用(105元),即升级为会员,可享受每次35元优惠价格。
3、在线\电话心理咨询,可随时QQ\手机进行预约。
QQ:605178363      手机:13179936689  Email:605178363@qq.com
网址:http://hi.baidu.com/jiayuanxinlizixun    
4、支付方式:支付宝、财富通, 建设银行卡、农业银行卡、工商银行卡 。

 回复 引用   
#147楼 2008-01-16 17:31 宗建[未注册用户]
//这是我自己编写的一个事例,有不对的地方希望您能帮我改正!
namespace ARDemo
{
[ActiveRecord("xuesheng")]//指定数据库表名xusheng
public class xuesheng:ActiveRecordBase
{
private int _id;
private string _name;
private string _banji;
private _sfz;
//指定字段名
[PrimaryKey(PrimaryKeyType.Native,"xs_id")]
public int Id//ID号
{
get{return _id;}
set{_id=value;}
}
[property("xs_name"),ValidateNotEmpty]
public string Name //名字
{
get{return _name;}
set{_name=value;}
}
[Property("xs_banji")]
pubic string Banji//班级
{
get{return _banji;}
set{_banji=value;}
}
[Property("xs_sfz"),ValidateNotEmpty]
pubic string Sfz//身份证号
{
get{return _sfz;}
set{_sfz=value;}

}
private DateTime createDateTime;
[Property(Update=false)]
public DateTime CreateDateTime
{
get{return createDateTime;}
set{createDateTime=value;}
}
[HasMany(typeof(Post),Table="posts",ColumnKey="post_blogid",Lazy=true)]
//上面的话我还不明白什么意思,有什么作用,请前辈指教。应该填加到什么地方?????????????????????????????
public static void DeleAll()
{
DeleteAll(typeof(xusheng));
}
public static xusheng[] FindAll()
{
return(Blog[] FindAll(typeof(xusheng));
}
public static xuesheng Find (int id)
{
return(xusheng)FindByPrimaryKey(typeof(xusheng),id);
}
}
}
public class ARTester
{
public static void Test()
{
ActiveRecordStarter.Initialize(Assembly.GetExecutingAssembly(),new XmlConfigurationSource("ar.xml"));
ActiveRecordStarter.DropSchema();
ActiveRecordStarter.CreateSchema();
xusheng xs=new xusheng();
xs.Id="1";
xs.Name="tom";
xs.Sfz="12233434343";
xs.CreateDateTime=DateTime.Now;
xusheng.Save();

Console.WriteLine(xusheng.CreateDateTime);
System.Threading.Thread.Sleep(2000);

xusheng xs2=xusheng.Find(user.id);
xs2.Name="abc";
xs2.CreateDateTime=DateTime.Now.AddDays(100);
xs2.Update();

xs.Refreash();
Console.WriteLine(xs.Name);
Console.WriteLine(xs.CreateDateTime);
}
}

 回复 引用 查看   
#148楼 2008-05-21 12:22 零缺陷生活      
在使用下面的自定义类的实例时中,如何获取be.Id的PropertyAttribute??

BugETT be = new BugETT();

be.Id

/////////////////////////////////////////////

[ActiveRecord("TB_BUG")]
public class BugETT
{

private Int32 m_Id;


public BugETT(){}


[Property("BUG_ID")]
public Int32 Id
{
get { return m_Id; }
set { m_Id = value; }
}

}

 回复 引用   
#149楼 2008-05-29 21:57 oncoding[未注册用户]
@qcrsoft
user 是T-SQL的关键字。使用会有些麻烦。通常用users

 回复 引用 查看   
#150楼 2008-08-31 16:20 西狐      
Castle.ActiveRecord.ActiveRecordStarter.Initialize(typeof(类).Assembly, source);
这句初始化的作用是初始化些什么东西呢?

 回复 引用 查看   
#151楼[楼主] 2008-09-01 21:55 TerryLee      
@西狐
初始化所有的业务实体类。。。

 回复 引用 查看   
#152楼 2008-09-22 22:18 夏斌      
非常感谢 TerryLee 大哥的文章
 回复 引用   
#153楼 2008-09-24 17:22 guihuomao[未注册用户]
null id in entry (don't flush the Session after an exception occurs)
 回复 引用 查看   
#154楼 2008-11-03 11:06 尘土飞扬      
好象不實用吧,請參看我寫的實體類
http://www.cnblogs.com/itcsx
.Net應用企業系統實用架構系列------實體對象Model

 回复 引用 查看   
#155楼 2008-11-06 18:04 田景      
我总觉得在实体类中弄什么Create,Update等的操作显得是在不雅观。
另外实体类还需要继承ActiveRecordBase,更加显得不爽了。

 回复 引用 查看   
#156楼[楼主] 2008-11-06 20:26 TerryLee      
@田景
设计有多种形式,没有哪一种是放之四海而皆准的,呵呵

 回复 引用 查看   
#157楼 2008-12-17 11:20 4978      
hello
我是用的VS2008,在程序里,IConfigurationSource source = System.Configuration.ConfigurationSettings.GetConfig("activerecord") as IConfigurationSource;
这里source得到的值是null,是什么原因的?

我的web.config 里是这样写的:<configSections><sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
<section name="activerecord" type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord"/>
</sectionGroup>
</sectionGroup>
</configSections>

困扰了好几天了,请教一下,呵呵

 回复 引用 查看   
#158楼[楼主] 2008-12-17 11:25 TerryLee      
@4978
<section name="activerecord" type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord"/>
应该放在configSections下面,而不是放在system.web.extensions的SectionGroup中。

 回复 引用 查看   
#159楼 2008-12-17 12:55 4978      
@TerryLee
OK了,谢谢了

 回复 引用 查看   
#160楼 2008-12-27 11:32 小狼狗      
good
 回复 引用 查看   
#161楼[楼主] 2009-01-04 11:29 TerryLee      
@小狼狗
:)

 回复 引用 查看   
#162楼 2009-02-25 22:09 chuncn      
本文的工具的地址可以告诉一下不,下载的是新版本的(CastleProject-1.0-RC3.msi),没有图中所示工具呀。
 回复 引用   
#163楼 2009-05-02 17:46 没钱买烟啦

ActiveRecordStarter.Initialize(source, typeof(User));
该句时老是提示:


“Castle.ActiveRecord.Framework.Internal.ActiveRecordModelBuilder”的类型初始值设定项引发异常。


配置文件没有错误,连接数据库没有错库,会是哪里呢?你能够告诉你,运行你这个,需要引用到Castle里的哪几个dll

 回复 引用 查看   
#164楼 2009-09-28 16:53 jolboy      
想咨询一下,如果我是在页面上动态的创建表,及字段,那这些动态的表,如何去建出他们的实体类呢。。。
 回复 引用   
#165楼 2009-11-27 10:19 sanford[未注册用户]
首先说说自己的感受吧 ,不针对 框架的好坏, 本人使用过 Hibernate,Ibitis.net 就自己的感觉来说这些ORM框架无非从数据库查询出来然后做一个Mapping然后匹配到类的各个属性上面,对于一般的查询,删除,修改来说这三个方法还是比较实用的,但是想一下如果数据库表格字段很多,我们每次查询就用 select是不是把这个表的字段都拿出来了,而真正需要的只是个别字段,这在Mapping的时候又通过发射来做,首先第一从数据库方面来说你查询的字段多了,是不是在物理磁盘上面的访问就多了,然后从数据库返回结果在网络传输上面是不是数据量增大了,而且内存方面是不是也因为一些没有必要的数据而膨胀了,最后到框架的Mapping过程当中是否也影响到Mapping的速度了(因为字段多),等等这些问题吧!框架能给我们提供一些方便,但是在某种程度上性能损失也是必然的。在自己经历的项目中只要我们用到反射的地方,头头们都比较反对,给我手工写,哈哈!
 回复 引用 查看   
#166楼 2010-01-27 12:27 小丛      
就是要准备让这个开发项目之前要准备什么环境呢?我应该到哪下载?
 回复 引用 查看   
#167楼 2010-03-17 20:50 项 中 生      
有一种情 我不知道能不能应用ORM:

软件中很常见的 【商品设置】
有些软件是 显示一个商品列表 新增、更新操作时都弹出一个新的页面或窗体,提交后关闭。这时应ORM很好。
另有些软件为了不过多地弹出页面或窗体。采用的是左右二栏式的操作,左边显示商品的列表,右边显示的是商品的详细信息。新增、更新操作都在右边完成,并且每次提交后不关闭页面或窗体,并且可以反复修改。这需要获取新增商品的在数据表中的ID(ID为自增型主键),否则用户再点一次提交,仍是新增操作。当然提交之后是可以去取最后一条记录的ID,但是,并发操作大时,可能就会错乱了。

不知这样说,大家是否理解我的意思。
请不吝赐教。

 回复 引用 查看   
#168楼 2010-04-16 15:16 LeeFly      
是否实现跨库事务?
 回复 引用 查看   
#169楼 2010-05-24 09:24 chunchill      
rails里的ActiveRecord应该和这个差不多,但是用起来比这个要简单。
 回复 引用 查看   
#170楼 2010-05-28 14:07 jy00613959      
你好可以将代码发给我吗?tieban@hotmail.com
谢谢
我是初学者,看了上面的代码对
Assert.IsNotNull(list);
assert是什么东西?

 回复 引用 查看   
#171楼 2010-09-14 12:18 桀骜的灵魂      
博主,这个让领域对象具有数据库访问行为,是否不合理?
 回复 引用 查看   
#172楼 2010-10-07 14:24 Leo.Xu      
博主,源码能发我一份吗??我的项目一直报错。。
邮箱: my_aspx@yahoo.com.cn

 回复 引用 查看   
#173楼 2010-11-05 02:56 天上有云      
引用firedemoning:下面代码中我把lastLogon注释掉,为什么就会出错
<br>public void AddUser()
<br>{
<br> User user = new User();
<br>
<br> user.Name = "Terrylee";
<br> user.Password = "aaa";
<br> user.Address = "lhj_cauc@163.com";
<br> // user.LastLogon = DateTime.Now; //注释掉,调试出错
<br>
<br> user.Create();
<br>}

求解
columbia sportswear outlet | the north face outlet

 回复 引用 查看   
#174楼 2011-03-18 22:35 muxiaoduan      
配置错误
说明: 在处理向该请求提供服务所需的配置文件时出错。请检查下面的特定错误详细信息并适当地修改配置文件。

分析器错误消息: 创建 activerecord 的配置节处理程序时出错: 调用的目标发生了异常。

源错误:


行 10: <configuration>
行 11: <configSections>
行 12: <section name="activerecord" type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord"/>
行 13: <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
行 14: <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">


总是无法加载Castle程序集,为什么啊?

 回复 引用 查看   
#175楼 2011-03-25 16:03 cbq      
运行到这句时报错ActiveRecordStarter.Initialize(source, typeof(User));
异常信息如下:
Error adding information from class ClassLibrary1.User to NHibernate. Check the inner exception for more information

"Error adding information from class ClassLibrary1.User to NHibernate. Check the inner exception for more information"}
{"Could not compile the mapping document: (string)"}

在 NHibernate.Cfg.Configuration.LogAndThrow(Exception exception)
在 NHibernate.Cfg.Configuration.AddDeserializedMapping(HbmMapping mappingDocument, String documentFileName)
在 NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc)
在 NHibernate.Cfg.Configuration.ProcessMappingsQueue()
在 NHibernate.Cfg.Configuration.AddDocumentThroughQueue(NamedXmlDocument document)
在 NHibernate.Cfg.Configuration.AddXmlReader(XmlReader hbmReader, String name)
在 NHibernate.Cfg.Configuration.AddXml(String xml, String name)
在 NHibernate.Cfg.Configuration.AddXml(String xml)
在 NHibernate.Cfg.Configuration.AddXmlString(String xml)
在 Castle.ActiveRecord.ActiveRecordStarter.AddXmlString(Configuration config, String xml, ActiveRecordModel model)

 回复 引用 查看   
#176楼 2011-04-21 11:06 阿齐      
to cbq:
报这个错误的原因可能在配置方面,你把
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
<add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2000Dialect" />
<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
<add key="hibernate.connection.connection_string" value="UID=sa;Password=sa;Initial Catalog=ARDemo;Data Source=." />
的“hibernate”去掉,改为
<add key="connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
<add key="dialect" value="NHibernate.Dialect.MsSql2000Dialect" />
<add key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
<add key="connection.connection_string" value="UID=sa;Password=sa;Initial Catalog=ARDemo;Data Source=." />
并且添加一个
<add
key="proxyfactory.factory_class"
value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle" />
试试。

http://baiyuxi.net


评论共2页: 上一页 1 2