我希望Masstransit订阅服务使用的数据库在第一次访问时不存在时自动创建。
我对NHibernate知之甚少,无法自己解决这个问题。在实体框架中,配置数据库自动生成是微不足道的,但是there seems to be no EF integration with MT yet。如果我直接处理NHibernate,我发现some code snippets可能会有效,但我不知道我应该把这段代码放在哪里,这样它就能用于为MassTransit创建的额外抽象层。
这是我对MT所要求的sessionfactory的容器注册:
.RegisterType<ISessionFactory>
(new ContainerControlledLifetimeManager(),
new InjectionFactory(_context => new NHibernateSessionFactoryProvider(new[]
{
typeof (SubscriptionSagaMap),
typeof (SubscriptionClientSagaMap)
}).GetSessionFactory()))
我尝试弄乱第二个NHibernateSessionFactoryProvider
构造函数的参数无济于事。无论我做什么,我总是得到这个例外:
InvalidOperationException异常: “无法创建会话工厂”
的InnerException: System.Data.SqlClient.SqlException: “不能打开 登录请求的数据库“DbTest”。登录失败。登录 用户'[my_user]'失败。“
答案 0 :(得分:2)
您可以切换到NHibernate的SQLite提供程序或类似的东西。
还有一个SQL脚本用于设置源存储库中可用的数据库:
它也可能包含在ZIP发行版中,我不是正面的。如脚本所示,需要许多索引来确保服务执行大量订阅。
答案 1 :(得分:0)
尝试这种方式
container = new UnityContainer();
MassTransit.Log4NetIntegration.Logging.Log4NetLogger.Use();
// Register the ServiceBus to our container.
container.RegisterInstance<IServiceBus>(ServiceBusFactory.New(sbc =>
{
sbc.UseMsmq();
sbc.ReceiveFrom("msmq://localhost/Mt_Msmq_Saga_Unity");
sbc.SetConcurrentConsumerLimit(100);
sbc.UseControlBus();
sbc.SetCreateMissingQueues(true);
sbc.SetPurgeOnStartup(true);
//sbc.UseMulticastSubscriptionClient();
sbc.Subscribe(subs =>
{
subs.LoadFrom(container);
subs.Saga<RfqSubmittedSaga>(new NHibernateSagaRepository<RfqSubmittedSaga>(Fluently
.Configure()
.Database(
MsSqlConfiguration.MsSql2012
.AdoNetBatchSize(100)
.ConnectionString(s => s.Is("Server=192.168.0.2\\SQL2012EXP;initial catalog=MTSaga; User Id=sa; Password=mypassword;"))
.DefaultSchema("dbo")
.Raw(NHibernate.Cfg.Environment.Isolation, IsolationLevel.Serializable.ToString()))
.ProxyFactoryFactory("NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate")
.Mappings(m =>
{
// Tell Fluent NHibernate about our mapping to store the Saga.
m.FluentMappings.Add<RfqSubmittedSagaMap>();
})
.ExposeConfiguration(c => new SchemaUpdate(c).Execute(false, true))
.BuildSessionFactory())).Permanent();
});
}));