通过本文主要向大家介绍了sql server 与mysql,sql server 与oracle,ms sql server与sybas,access与sql server,sql与sql server等相关知识,希望本文的分享对您有所帮助
本文实例为大家分享了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();
}
}
}
</div>
相关辅助类代码如下:
public static class Initer
{
public static void Init(string sqlServerConnectionString, string mongoConnectionString)
{
//SqlServer初始化
SessionFactory.Init(sqlServerConnectionString);
//Mongodb初始化
NodeLinkRepository.Init(mongoConnectionString);
}
}
</div>
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();
}
}
</div>
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 MongoColle

