亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MongoDB > 正文

SqlServer與MongoDB結合使用NHibernate

2020-03-14 13:04:20
字體:
來源:轉載
供稿:網友

本文實例為大家分享了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) 

結果如圖:

SqlServer,MongoDB,NHibernate

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到MongoDB頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
少妇精69xxtheporn| 91精品国产九九九久久久亚洲| 欧美午夜性色大片在线观看| 欧美巨乳在线观看| 亚洲天堂av在线免费观看| 久久综合伊人77777尤物| 国产视频亚洲精品| 国产精品爽爽爽爽爽爽在线观看| 亚洲性夜色噜噜噜7777| 国产精品欧美一区二区三区奶水| 97久久国产精品| 色老头一区二区三区在线观看| 欧美成人精品在线视频| 午夜精品一区二区三区在线视频| 97在线视频免费播放| 久久精品久久久久电影| 国产成人精品一区二区三区| 一本色道久久综合狠狠躁篇的优点| 成人网中文字幕| 欧美不卡视频一区发布| 欧美xxxx做受欧美| www.日韩不卡电影av| 中文字幕日韩欧美| 2019中文字幕免费视频| 欧美中文字幕视频在线观看| 成人av.网址在线网站| 国产精品日日摸夜夜添夜夜av| 亚洲国产成人久久综合一区| 欧美电影院免费观看| 在线观看日韩专区| 成人乱人伦精品视频在线观看| 国产不卡一区二区在线播放| 91天堂在线观看| 欧美日韩一区二区精品| 91精品国产综合久久久久久蜜臀| 国产手机视频精品| 在线视频欧美日韩精品| 亚洲欧美日韩中文视频| 中文字幕综合在线| 午夜精品视频网站| 96sao精品视频在线观看| 国产精品96久久久久久又黄又硬| 欧美刺激性大交免费视频| 国产精品自产拍在线观| 国产精品亚洲综合天堂夜夜| 日韩在线观看你懂的| 在线电影欧美日韩一区二区私密| 亚洲欧美日韩爽爽影院| 国产精品视频精品视频| 国产成人综合精品在线| 亚洲欧美日韩精品久久| 精品动漫一区二区三区| 一区二区三区国产视频| 久久中文久久字幕| 色久欧美在线视频观看| 91精品国产高清自在线看超| 丝袜亚洲欧美日韩综合| 久久中文字幕在线| 在线色欧美三级视频| 成人激情视频在线| 亚洲图片欧美日产| 91精品国产综合久久香蕉922| 亚洲天堂av电影| 粉嫩av一区二区三区免费野| 中文字幕日韩精品有码视频| 日韩av在线看| 日本不卡免费高清视频| 国产精品久久久久7777婷婷| 成人精品久久一区二区三区| 国产精品影片在线观看| 亚洲天堂开心观看| 国产成人一区二区三区| 最新国产成人av网站网址麻豆| 亚洲一区亚洲二区| 91精品久久久久久久久久久久久久| 色综合老司机第九色激情| www.国产精品一二区| 91精品国产91久久久久久不卡| 欧美激情第1页| 91在线观看免费| 国产精品丝袜久久久久久不卡| 日韩av中文在线| 国产精品久久久久久亚洲影视| 欧美在线亚洲在线| 日韩av网站大全| 久久香蕉国产线看观看网| 91国语精品自产拍在线观看性色| 国产视频久久久久久久| 色综合伊人色综合网| 亚洲国内精品在线| 亚洲精品国精品久久99热一| 91久久精品日日躁夜夜躁国产| 国产91久久婷婷一区二区| 不卡伊人av在线播放| 国产精品视频公开费视频| 亚洲欧美制服中文字幕| 91久久在线播放| 亚洲视频在线免费观看| 欧美午夜激情在线| 亚洲一区二区久久久久久| 亚洲japanese制服美女| 久久在线免费观看视频| 亚洲韩国青草视频| 欧美性受xxxx黑人猛交| 久久精品91久久香蕉加勒比| 97在线视频国产| 91色视频在线导航| 91视频免费网站| 一区二区三区国产在线观看| 国产精品wwwwww| 国产精品影院在线观看| 欧美电影在线播放| 欧洲永久精品大片ww免费漫画| 国产精品视频一区国模私拍| 久久久亚洲国产天美传媒修理工| 日韩在线欧美在线国产在线| 亚洲人成啪啪网站| 午夜精品久久久久久99热| 中文字幕精品久久| 成人在线激情视频| 亚洲精品日韩激情在线电影| 国产精品一区二区三区久久| 久久久久久国产免费| 久久免费国产精品1| 成人久久久久久| 久久久国产精品亚洲一区| 久久久国产影院| 欧美成人精品一区| 日韩在线精品视频| 久久国产视频网站| 91高清免费视频| 亚洲一区二区免费| 精品国产欧美一区二区三区成人| 91久久在线播放| 国产视频久久久久久久| 米奇精品一区二区三区在线观看| 久久精品国产亚洲精品2020| 欧美限制级电影在线观看| 欧美日韩成人在线播放| 中文字幕av一区中文字幕天堂| 日韩一区二区在线视频| 在线观看欧美日韩| 国产精品久久久久久久美男| 欧美插天视频在线播放| 亚洲第一视频网| 性色av一区二区三区在线观看| 国产精品色午夜在线观看| 亚洲国产精彩中文乱码av在线播放| 久久精品亚洲94久久精品| 视频在线一区二区| 在线观看免费高清视频97| 97久久久久久| 欧美国产极速在线| 中文字幕亚洲综合| 日韩av免费观影| 欧美精品一本久久男人的天堂| 成人日韩av在线| 久久免费成人精品视频| 欧美极品美女视频网站在线观看免费| 成人精品福利视频| 国产精品一区二区三区在线播放| 91精品久久久久久久久久久久久| 国产亚洲综合久久| 久久精品国产91精品亚洲|