首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >session.Save和transaction.Commit不支持NHibernate

session.Save和transaction.Commit不支持NHibernate
EN

Stack Overflow用户
提问于 2019-10-05 03:27:50
回答 1查看 384关注 0票数 0

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

我可以读取数据,但当我尝试保存或删除时,它不起作用。

有太多的信息,比如我是如何创建我的服务、存储库和映射的,所以我将跳过这个问题中的一些文件,但在my git repo上一切都是可用的。

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

代码语言:javascript
运行
复制
public class Book
{
    public virtual Guid Id { get; set; }
    public virtual string Title { get; set; }
}

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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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时,它不会持久保存在数据库中。

代码语言:javascript
运行
复制
public void Delete(T entity){
    using (var transaction = Session.BeginTransaction())
    {
        Session.Delete(entity);                
        transaction.Commit();
        Session.Flush();
    }
}

当我调用Queryable.ToList()时,我会如期得到所有东西。

我在配置上做错了什么,它不存在于db中?

观察:数据库为SQL Server 2017,在docker容器上运行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-05 19:03:16

这是因为您在每个Session access上打开新会话

代码语言:javascript
运行
复制
protected ISession Session => SessionFactory.OpenSession();

事务在一个会话中启动,在另一个会话中添加/删除,在第三个会话中刷新。显然,您需要在一个会话中完成所有操作。

此外,默认情况下不需要调用Flush -它应该在transaction.Commit上自动调用。如果你真的需要调用Flush --在事务提交之前完成。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58242190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档