NHibernate不会持久化session.Save和transaction.Commit

时间:2019-10-04 19:27:50

标签: c# nhibernate .net-core fluent-nhibernate blazor

我正在尝试在.net核心上配置NHibernate,但仍然没有成功。

我可以读取数据,但是当我尝试保存或删除数据时,它将无法正常工作。

有太多信息,例如我如何创建服务,存储库和映射,因此我将跳过此问题中的一些文件,但是所有内容都可以在my git repo获得。

所以我有一个非常简单的模型。

public class Book
{
    public virtual Guid Id { get; set; }
    public virtual string Title { get; set; }
}

我还创建了一种扩展方法,用于在服务中添加nhibernate

public static class NHibernateExtensions
{  

    public static IServiceCollection AddNHibernate(this IServiceCollection services, string connectionString)
    {
        var mapper = new ModelMapper();
        mapper.AddMappings(typeof(NHibernateExtensions).Assembly.ExportedTypes);
        HbmMapping domainMapping = mapper.CompileMappingForAllExplicitlyAddedEntities();

        var configuration = new Configuration()
            .DataBaseIntegration(c =>
            {
                c.Dialect<MsSql2012Dialect>();
                c.ConnectionString = connectionString;
                c.KeywordsAutoImport = Hbm2DDLKeyWords.AutoQuote;
                c.SchemaAction = SchemaAutoAction.Validate;
                c.LogFormattedSql = true;
                c.LogSqlInConsole = true;
            });

        configuration.AddMapping(domainMapping);
        var fluentSessionFactory = Fluently
            .Configure(configuration)
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Book>())
            .BuildSessionFactory();

        var sessionFactory = configuration.BuildSessionFactory();

        services.AddSingleton(fluentSessionFactory);
        services.AddScoped(factory => fluentSessionFactory.OpenSession());
        services.AddScoped<ISessionManager, SessionManager>();

        return services;
    }
}

这是我的StartUp

public void ConfigureServices(IServiceCollection services)
{
    var connStr = Configuration.GetConnectionString("DefaultConnection");

    services.AddRazorPages();
    services.AddServerSideBlazor();
    services.AddSingleton<WeatherForecastService>();
    services.AddNHibernate(connStr);

    services.AddTransient<IBookRepository, BookRepository>();
    services.AddTransient<IBookService, BookService>();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
    }

    app.UseStaticFiles();

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapBlazorHub();
        endpoints.MapFallbackToPage("/_Host");
    });
}

然后我创建了一个BaseRepository来处理简单的存储库操作。

我遇到的问题是在BaseRepository中,当我调用Add时,它不会持久存在于数据库中。

public void Delete(T entity){
    using (var transaction = Session.BeginTransaction())
    {
        Session.Delete(entity);                
        transaction.Commit();
        Session.Flush();
    }
}

当我致电Queryable.ToList()时,一切都按预期完成。

我在数据库中无法持久保存的配置上做错了什么?

观察:该数据库是SQL Server 2017,并且在docker容器上运行。

1 个答案:

答案 0 :(得分:1)

那是因为您在每个Session access上打开了新会话:

protected ISession Session => SessionFactory.OpenSession();

在一个会话中开始事务,在另一个会话中添加/删除,在第三次刷新中开始。显然,您需要在一个会话中进行所有操作。

此外,您无需默认调用Flush-应该在transaction.Commit上自动调用它。而且,如果您确实需要调用Flush,请在提交事务之前执行此操作。