无为清净楼资源网 Design By www.qnjia.com
本文实例为大家分享了SqlServer与MongoDB结合使用NHibernate的代码,供大家参考,具体内容如下
Program.cs代码内容:
class Program { private const string SqlServerConnectionString = @"Data Source=.;Initial Catalog=SqlWithMongo;Persist Security Info=True;User ID=sa;Password=123456"; private const string MongoConnectionString = "mongodb://localhost:27017"; private const int NumberOfNodes = 1000; private static void Main(string[] args) { Console.WriteLine("Clearing database..."); ClearDatabases(); Initer.Init(SqlServerConnectionString, MongoConnectionString); Console.WriteLine("Completed"); Console.WriteLine("Creating nodes..."); //创建sqlserver的Node节点 CreateNodes(); Console.WriteLine("Completed"); Console.WriteLine("Linking nodes..."); long milliseconds1 = LinkSqlNodes(); //创建sqlserver的LinkNode节点 Console.WriteLine("SQL : " + milliseconds1); long milliseconds2 = LinkMongoNodes(); //同时创建Node,LinkNode节点 Console.WriteLine("Mongo : " + milliseconds2); Console.WriteLine("Completed"); Console.WriteLine("Fetching nodes..."); long milliseconds3 = FetchSqlNodes(); //取出sqlserver节点数据 Console.WriteLine("SQL : " + milliseconds3); long milliseconds4 = FetchMongoNodes(); //取出Mongodb节点数据 Console.WriteLine("Mongo : " + milliseconds4); Console.WriteLine("Completed"); Console.ReadKey(); } private static long FetchMongoNodes() { var stopwatch = new Stopwatch(); stopwatch.Start(); for (int i = 0; i < NumberOfNodes; i++) { using (var unitOfWork = new UnitOfWork()) { var repository = new MongoNodeRepository(unitOfWork); MongoNode node = repository.GetById(i + 1); IReadOnlyList<NodeLink> links = node.Links; } } stopwatch.Stop(); return stopwatch.ElapsedMilliseconds; } private static long FetchSqlNodes() { var stopwatch = new Stopwatch(); stopwatch.Start(); for (int i = 0; i < NumberOfNodes; i++) { using (var unitOfWork = new UnitOfWork()) { var repository = new NodeRepository(unitOfWork); Node node = repository.GetById(i + 1); IReadOnlyList<Node> links = node.Links; } } stopwatch.Stop(); return stopwatch.ElapsedMilliseconds; } private static long LinkSqlNodes() { var stopwatch = new Stopwatch(); stopwatch.Start(); using (var unitOfWork = new UnitOfWork()) { var repository = new NodeRepository(unitOfWork); IList<Node> nodes = repository.GetAll(); foreach (Node node1 in nodes) { foreach (Node node2 in nodes) { node1.AddLink(node2); } } unitOfWork.Commit(); } stopwatch.Stop(); return stopwatch.ElapsedMilliseconds; } private static long LinkMongoNodes() { var stopwatch = new Stopwatch(); stopwatch.Start(); using (var unitOfWork = new UnitOfWork()) { var repository = new MongoNodeRepository(unitOfWork); IList<MongoNode> nodes = repository.GetAll(); foreach (MongoNode node1 in nodes) { foreach (MongoNode node2 in nodes) { node1.AddLink(node2); } } unitOfWork.Commit(); } stopwatch.Stop(); return stopwatch.ElapsedMilliseconds; } private static void CreateNodes() { using (var unitOfWork = new UnitOfWork()) { var repository = new NodeRepository(unitOfWork); for (int i = 0; i < NumberOfNodes; i++) { var node = new Node("Node " + (i + 1)); //实例化 构造函数初始化name repository.Save(node); } unitOfWork.Commit(); } using (var unitOfWork = new UnitOfWork()) { var repository = new MongoNodeRepository(unitOfWork); for (int i = 0; i < NumberOfNodes; i++) { var node = new MongoNode("Node " + (i + 1)); repository.Save(node); } unitOfWork.Commit(); } } //清空数据 private static void ClearDatabases() { new MongoClient(MongoConnectionString) .GetDatabase("sqlWithMongo") .DropCollectionAsync("links") .Wait(); string query = "DELETE FROM [dbo].[MongoNode];" + "DELETE FROM [dbo].[Node_Node];" + "DELETE FROM [dbo].[Node];" + "UPDATE [dbo].[Ids] SET [NextHigh] = 0"; using (var connection = new SqlConnection(SqlServerConnectionString)) { var command = new SqlCommand(query, connection) { CommandType = CommandType.Text }; connection.Open(); command.ExecuteNonQuery(); } } }
相关辅助类代码如下:
public static class Initer { public static void Init(string sqlServerConnectionString, string mongoConnectionString) { //SqlServer初始化 SessionFactory.Init(sqlServerConnectionString); //Mongodb初始化 NodeLinkRepository.Init(mongoConnectionString); } }
public static class SessionFactory //工厂 { private static ISessionFactory _factory; internal static ISession OpenSession() { return _factory.OpenSession(new Interceptor()); } internal static void Init(string connectionString) { _factory = BuildSessionFactory(connectionString); } private static ISessionFactory BuildSessionFactory(string connectionString) { //用编程的方式进行配置,让你能更好的理解,不需要编写复杂的映射文件,它能完全替换NHibernate的映射文件,让你在映射的时候能使用C#的强类型方式。 FluentConfiguration configuration = Fluently.Configure() .Database(MsSqlConfiguration.MsSql2012.ConnectionString(connectionString)) .Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly())) .ExposeConfiguration(x => { x.EventListeners.PostLoadEventListeners = new IPostLoadEventListener[] { new EventListener() }; }); return configuration.BuildSessionFactory(); } }
internal class NodeLinkRepository //仓库 Repository模式 { private static IMongoCollection<NodeLinks> _collection; public IList<NodeLink> GetLinks(int nodeId) { NodeLinks links = _collection.Find(x => x.Id == nodeId).SingleOrDefaultAsync().Result; if (links == null) return new NodeLink[0]; return links.Links; } public Task SaveLinks(int nodeId, IEnumerable<NodeLink> links) { var nodeLinks = new NodeLinks(nodeId, links); var updateOptions = new UpdateOptions { IsUpsert = true }; return _collection.ReplaceOneAsync(x => x.Id == nodeId, nodeLinks, updateOptions); } internal static void Init(string connectionString) { var client = new MongoClient(connectionString); IMongoDatabase database = client.GetDatabase("sqlWithMongo"); var collectionSettings = new MongoCollectionSettings { WriteConcern = new WriteConcern(1) }; _collection = database.GetCollection<NodeLinks>("links", collectionSettings); } private class NodeLinks { public int Id { get; private set; } public List<NodeLink> Links { get; private set; } public NodeLinks(int nodeId, IEnumerable<NodeLink> links) { Id = nodeId; Links = new List<NodeLink>(); Links.AddRange(links); } } }
public class NodeRepository { private readonly UnitOfWork _unitOfWork; public NodeRepository(UnitOfWork unitOfWork) { _unitOfWork = unitOfWork; } public Node GetById(int id) { return _unitOfWork.Get<Node>(id); } public IList<Node> GetAll() { return _unitOfWork.Query<Node>() .ToList(); } public void Save(Node mongoNode) { _unitOfWork.SaveOrUpdate(mongoNode); } }
public class MongoNodeRepository { private readonly UnitOfWork _unitOfWork; public MongoNodeRepository(UnitOfWork unitOfWork) { _unitOfWork = unitOfWork; } public MongoNode GetById(int id) { return _unitOfWork.Get<MongoNode>(id); } public void Save(MongoNode mongoNode) { _unitOfWork.SaveOrUpdate(mongoNode); } public IList<MongoNode> GetAll() { return _unitOfWork.Query<MongoNode>() .ToList(); } }
模型层数据:
Node.cs,NodeMap.cs类代码如下:
public class Node { public virtual int Id { get; protected set; } public virtual string Name { get; protected set; } protected virtual ISet<Node> LinksInternal { get; set; } public virtual IReadOnlyList<Node> Links { get { return LinksInternal.ToList(); } } protected Node() { LinksInternal = new HashSet<Node>(); } public Node(string name) : this() { Name = name; } public virtual void AddLink(Node node) { LinksInternal.Add(node); node.LinksInternal.Add(this); } }
public class NodeMap : ClassMap<Node> //FluentNHibernate.Mapping.ClasslikeMapBase<T> { public NodeMap() { Id(x => x.Id, "NodeId").GeneratedBy.HiLo("[dbo].[Ids]", "NextHigh", "10", "EntityName = 'Node'"); Map(x => x.Name).Not.Nullable(); HasManyToMany<Node>(Reveal.Member<Node>("LinksInternal")) .AsSet() .Table("Node_Node") .ParentKeyColumn("NodeId1") .ChildKeyColumn("NodeId2"); } }
MongoNode.cs和MongoNodeMap.cs的代码如下:
public class MongoNode { public virtual int Id { get; protected set; } public virtual string Name { get; protected set; } protected virtual HashSet<NodeLink> LinksInternal { get; set; } public virtual IReadOnlyList<NodeLink> Links { get { return LinksInternal.ToList(); } } protected MongoNode() { LinksInternal = new HashSet<NodeLink>(); } public MongoNode(string name) : this() { Name = name; } public virtual void AddLink(MongoNode mongoNode) { LinksInternal.Add(new NodeLink(mongoNode.Id, mongoNode.Name)); mongoNode.LinksInternal.Add(new NodeLink(Id, Name)); } }
public class MongoNodeMap : ClassMap<MongoNode> //FluentNHibernate中的类继承 { public MongoNodeMap() { Id(x => x.Id, "MongoNodeId").GeneratedBy.HiLo("[dbo].[Ids]", "NextHigh", "10", "EntityName = 'MongoNode'"); Map(x => x.Name).Not.Nullable(); } }
Utils层的类:
EventListener.cs内容:
internal class EventListener : IPostLoadEventListener //NHibernate.Event继承 { public void OnPostLoad(PostLoadEvent ev) { var networkNode = ev.Entity as MongoNode; if (networkNode == null) return; var repository = new NodeLinkRepository(); IList<NodeLink> linksFromMongo = repository.GetLinks(networkNode.Id); HashSet<NodeLink> links = (HashSet<NodeLink>)networkNode .GetType() .GetProperty("LinksInternal", BindingFlags.NonPublic | BindingFlags.Instance) .GetValue(networkNode); links.UnionWith(linksFromMongo); } }
internal class Interceptor : EmptyInterceptor //NHibernate中的类 { public override void PostFlush(ICollection entities) { IEnumerable<MongoNode> nodes = entities.OfType<MongoNode>(); if (!nodes.Any()) return; var repository = new NodeLinkRepository(); Task[] tasks = nodes.Select(x => repository.SaveLinks(x.Id, x.Links)).ToArray(); Task.WaitAll(tasks); } }
UnitOfWork.cs代码:
public class UnitOfWork : IDisposable { private readonly ISession _session; private readonly ITransaction _transaction; private bool _isAlive = true; private bool _isCommitted; public UnitOfWork() { _session = SessionFactory.OpenSession(); _transaction = _session.BeginTransaction(IsolationLevel.ReadCommitted); } public void Dispose() { if (!_isAlive) return; _isAlive = false; try { if (_isCommitted) { _transaction.Commit(); } } finally { _transaction.Dispose(); _session.Dispose(); } } public void Commit() { if (!_isAlive) return; _isCommitted = true; } internal T Get<T>(int id) { return _session.Get<T>(id); } internal void SaveOrUpdate<T>(T entity) { _session.SaveOrUpdate(entity); } internal IQueryable<T> Query<T>() { return _session.Query<T>(); } }
Database.sql建表语句:
CREATE DATABASE [SqlWithMongo] GO USE [SqlWithMongo] GO /****** 表 [dbo].[Ids] ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Ids]( [EntityName] [nvarchar](100) NOT NULL, [NextHigh] [int] NOT NULL, CONSTRAINT [PK_Ids] PRIMARY KEY CLUSTERED ( [EntityName] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO /****** 表 [dbo].[MongoNode] ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[MongoNode]( [MongoNodeId] [int] NOT NULL, [Name] [nvarchar](100) NOT NULL, CONSTRAINT [PK_MongoNode] PRIMARY KEY CLUSTERED ( [MongoNodeId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO /****** 表 [dbo].[Node] ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Node]( [NodeId] [int] NOT NULL, [Name] [nvarchar](100) NOT NULL, CONSTRAINT [PK_NetworkNode] PRIMARY KEY CLUSTERED ( [NodeId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO /****** 表 [dbo].[Node_Node] ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Node_Node]( [NodeId1] [int] NOT NULL, [NodeId2] [int] NOT NULL, CONSTRAINT [PK_NetworkNode_NetworkNode] PRIMARY KEY CLUSTERED ( [NodeId1] ASC, [NodeId2] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO ALTER TABLE [dbo].[Node_Node] WITH CHECK ADD CONSTRAINT [FK_NetworkNode_NetworkNode_NetworkNode] FOREIGN KEY([NodeId1]) REFERENCES [dbo].[Node] ([NodeId]) GO ALTER TABLE [dbo].[Node_Node] CHECK CONSTRAINT [FK_NetworkNode_NetworkNode_NetworkNode] GO ALTER TABLE [dbo].[Node_Node] WITH CHECK ADD CONSTRAINT [FK_NetworkNode_NetworkNode_NetworkNode1] FOREIGN KEY([NodeId2]) REFERENCES [dbo].[Node] ([NodeId]) GO ALTER TABLE [dbo].[Node_Node] CHECK CONSTRAINT [FK_NetworkNode_NetworkNode_NetworkNode1] GO INSERT dbo.Ids (EntityName, NextHigh) VALUES ('MongoNode', 0) INSERT dbo.Ids (EntityName, NextHigh) VALUES ('Node', 0)
结果如图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
无为清净楼资源网 Design By www.qnjia.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
无为清净楼资源网 Design By www.qnjia.com
暂无评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
2024年11月17日
2024年11月17日
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】