最近使用Castle.ActiveRecord框架,網上關於多數據支持的文章很少,因此有了這篇博文的產生。 開發工具VS2015,Sql Server2008R2 新建資料庫,數據初始化腳本如下: 3.新建MVC項目ActiveRecord.Demo,新建類庫Castle.ActiveRecord. ...
最近使用Castle.ActiveRecord框架,網上關於多數據支持的文章很少,因此有了這篇博文的產生。
-
開發工具VS2015,Sql Server2008R2
-
新建資料庫,數據初始化腳本如下:
1 --新建資料庫Castle.ActiveRecord.DB1 2 CREATE DATABASE [Castle.ActiveRecord.DB1]; 3 GO 4 5 USE [Castle.ActiveRecord.DB1] 6 GO 7 /****** Object: Table [dbo].[Post] Script Date: 09/25/2016 16:46:21 ******/ 8 SET ANSI_NULLS ON 9 GO 10 SET QUOTED_IDENTIFIER ON 11 GO 12 CREATE TABLE [dbo].[Post]( 13 [Id] [int] IDENTITY(1,1) NOT NULL, 14 [Subject] [nvarchar](64) NULL, 15 [Text] [nvarchar](1024) NULL, 16 [DateAdded] [datetime] NULL, 17 PRIMARY KEY CLUSTERED 18 ( 19 [Id] ASC 20 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 21 ) ON [PRIMARY] 22 GO 23 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'自增主鍵' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Post', @level2type=N'COLUMN',@level2name=N'Id' 24 GO 25 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'主題' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Post', @level2type=N'COLUMN',@level2name=N'Subject' 26 GO 27 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'內容' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Post', @level2type=N'COLUMN',@level2name=N'Text' 28 GO 29 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'添加日期' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Post', @level2type=N'COLUMN',@level2name=N'DateAdded' 30 GO 31 SET IDENTITY_INSERT [dbo].[Post] ON 32 INSERT [dbo].[Post] ([Id], [Subject], [Text], [DateAdded]) VALUES (1, N'新聞', N'最新新聞內容', '2016-09-01') 33 INSERT [dbo].[Post] ([Id], [Subject], [Text], [DateAdded]) VALUES (2, N'音樂', N'流行音樂', '2016-09-02') 34 SET IDENTITY_INSERT [dbo].[Post] OFF 35 36 --新建資料庫Castle.ActiveRecord.DB2 37 CREATE DATABASE [Castle.ActiveRecord.DB2]; 38 GO 39 40 USE [Castle.ActiveRecord.DB2] 41 GO 42 /****** Object: Table [dbo].[Post] Script Date: 09/25/2016 16:53:05 ******/ 43 SET ANSI_NULLS ON 44 GO 45 SET QUOTED_IDENTIFIER ON 46 GO 47 CREATE TABLE [dbo].[Post]( 48 [Id] [int] IDENTITY(1,1) NOT NULL, 49 [Subject] [nvarchar](64) NULL, 50 [Text] [nvarchar](1024) NULL, 51 [DateAdded] [datetime] NULL, 52 PRIMARY KEY CLUSTERED 53 ( 54 [Id] ASC 55 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 56 ) ON [PRIMARY] 57 GO 58 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'自增主鍵' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Post', @level2type=N'COLUMN',@level2name=N'Id' 59 GO 60 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'主題' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Post', @level2type=N'COLUMN',@level2name=N'Subject' 61 GO 62 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'內容' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Post', @level2type=N'COLUMN',@level2name=N'Text' 63 GO 64 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'添加日期' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Post', @level2type=N'COLUMN',@level2name=N'DateAdded' 65 GO 66 SET IDENTITY_INSERT [dbo].[Post] ON 67 INSERT [dbo].[Post] ([Id], [Subject], [Text], [DateAdded]) VALUES (1, N'小說', N'紀實小說', '2016-09-03') 68 INSERT [dbo].[Post] ([Id], [Subject], [Text], [DateAdded]) VALUES (2, N'電腦', N'超極本', '2016-09-04') 69 SET IDENTITY_INSERT [dbo].[Post] OFF
3.新建MVC項目ActiveRecord.Demo,新建類庫Castle.ActiveRecord.DB1.Models,類庫Castle.ActiveRecord.DB2.Models
- MVC項目ActiveRecord.Demo文件添加Castle.ActiveRecord框架dll引用,使用NuGut搜索添加.添加對類庫Castle.ActiveRecord.DB1.Models,類庫Castle.ActiveRecord.DB2.Models的引用。
- 類庫Castle.ActiveRecord.DB1.Models,類庫Castle.ActiveRecord.DB2.Models添加Castle.ActiveRecord、NHibernate引用。
4.Castle.ActiveRecord.DB1.Models類庫添加DB1ActiveRecordBase抽象類文件,繼承自ActiveRecordBase基類.
添加Post類,繼承自DB1ActiveRecordBase抽象類
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Castle.ActiveRecord.DB1.Models 8 { 9 public abstract class DB1ActiveRecordBase : ActiveRecordBase 10 { 11 12 } 13 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Castle.ActiveRecord.DB1.Models 8 { 9 [ActiveRecord("Post")] 10 public class Post : DB1ActiveRecordBase 11 { 12 /// <summary> 13 /// 自增主鍵 14 /// </summary> 15 [PrimaryKey(PrimaryKeyType.Identity, Column = "Id")] 16 public int Id { set; get; } 17 18 19 /// <summary> 20 /// 主題 21 /// </summary> 22 [Property("Subject")] 23 public string Subject { set; get; } 24 25 26 /// <summary> 27 /// 內容 28 /// </summary> 29 [Property("Text")] 30 public string Text { set; get; } 31 32 /// <summary> 33 /// 添加日期 34 /// </summary> 35 [Property("DateAdded")] 36 public DateTime DateAdded { set; get; } 37 38 public static IEnumerable<Post> FindAllBy() 39 { 40 return FindAll(typeof(Post)).Cast<Post>(); ; 41 } 42 } 43 }
Castle.ActiveRecord.DB2.Models類庫添加DB2ActiveRecordBase抽象類文件,繼承自ActiveRecordBase基類
添加Post類,繼承自DB2ActiveRecordBase抽象類
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Castle.ActiveRecord.DB2.Models 8 { 9 public abstract class DB2ActiveRecordBase : ActiveRecordBase 10 { 11 12 } 13 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Castle.ActiveRecord.DB2.Models 8 { 9 [ActiveRecord("Post")] 10 public class Post : DB2ActiveRecordBase 11 { 12 /// <summary> 13 /// 自增主鍵 14 /// </summary> 15 [PrimaryKey(PrimaryKeyType.Identity, Column = "Id")] 16 public int Id { set; get; } 17 18 19 /// <summary> 20 /// 主題 21 /// </summary> 22 [Property("Subject")] 23 public string Subject { set; get; } 24 25 26 /// <summary> 27 /// 內容 28 /// </summary> 29 [Property("Text")] 30 public string Text { set; get; } 31 32 /// <summary> 33 /// 添加日期 34 /// </summary> 35 [Property("DateAdded")] 36 public DateTime DateAdded { set; get; } 37 38 public static IEnumerable<Post> FindAllBy() 39 { 40 return FindAll(typeof(Post)).Cast<Post>(); ; 41 } 42 } 43 }
5.MVC項目ActiveRecord.Demo項目Web.config配置多資料庫,主要是config節的type的配置
<configSections> <section name="activerecord" type="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord" /> </configSections> <connectionStrings> <add name="Castle.ActiveRecord.DB1" connectionString="Data Source=.;Initial Catalog=Castle.ActiveRecord.DB1;Integrated Security=SSPI"/> <add name="Castle.ActiveRecord.DB2" connectionString="Data Source=.;Initial Catalog=Castle.ActiveRecord.DB2;Integrated Security=SSPI"/> </connectionStrings> <activerecord isWeb="true"> <config type="Castle.ActiveRecord.DB1.Models.DB1ActiveRecordBase,Castle.ActiveRecord.DB1.Models"> <add key="connection.driver_class" value="NHibernate.Driver.SqlClientDriver" /> <add key="dialect" value="NHibernate.Dialect.MsSql2005Dialect" /> <add key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider" /> <add key="connection.connection_string_name" value="Castle.ActiveRecord.DB1" /> <add key="proxyfactory.factory_class" value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle" /> </config> <config type="Castle.ActiveRecord.DB2.Models.DB2ActiveRecordBase,Castle.ActiveRecord.DB2.Models"> <add key="connection.driver_class" value="NHibernate.Driver.SqlClientDriver" /> <add key="dialect" value="NHibernate.Dialect.MsSql2005Dialect" /> <add key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider" /> <add key="connection.connection_string_name" value="Castle.ActiveRecord.DB2" /> <add key="proxyfactory.factory_class" value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle" /> </config> </activerecord>
6.ActiveRecord.Demo項目Global文件Application_Start()方法中初始化ActiveRecord配置
1 using Castle.ActiveRecord; 2 using Castle.ActiveRecord.Framework; 3 using System; 4 using System.Collections.Generic; 5 using System.Linq; 6 using System.Web; 7 using System.Web.Mvc; 8 using System.Web.Optimization; 9 using System.Web.Routing; 10 11 namespace ActiveRecord.Demo 12 { 13 public class MvcApplication : System.Web.HttpApplication 14 { 15 protected void Application_Start() 16 { 17 AreaRegistration.RegisterAllAreas(); 18 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 19 RouteConfig.RegisterRoutes(RouteTable.Routes); 20 BundleConfig.RegisterBundles(BundleTable.Bundles); 21 22 InitActiveRecord(); 23 } 24 25 private void InitActiveRecord() 26 { 27 IConfigurationSource source = System.Configuration.ConfigurationManager.GetSection("activerecord") as IConfigurationSource; 28 ActiveRecordStarter.Initialize(source, 29 typeof(Castle.ActiveRecord.DB1.Models.DB1ActiveRecordBase), 30 typeof(Castle.ActiveRecord.DB1.Models.Post), 31 32 typeof(Castle.ActiveRecord.DB2.Models.DB2ActiveRecordBase), 33 typeof(Castle.ActiveRecord.DB2.Models.Post) 34 ); 35 } 36 } 37 }
7.配置現在完成,增加控制器視圖,進行兩個資料庫中Post表數據的顯示
-
新增控制器DB1PostController
1 using Castle.ActiveRecord.DB1.Models; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Web; 6 using System.Web.Mvc; 7 8 namespace ActiveRecord.Demo.Controllers 9 { 10 public class DB1PostController : Controller 11 { 12 // GET: DB1Post 13 public ActionResult Index() 14 { 15 IEnumerable<Post> post = Post.FindAllBy(); 16 17 return View(post); 18 } 19 } 20 }
對應視圖:
1 @using Castle.ActiveRecord.DB1.Models 2 @model IEnumerable<Post> 3 @{ 4 ViewBag.Title = "DB1-Post"; 5 } 6 7 <h2>DB1-Post</h2> 8 <table class="table"> 9 <thead> 10 <tr> 11 <th>主鍵</th> 12 <th>主題