小编Ped*_*tos的帖子

NHibernate批量插入或更新

嗨,我正在开发一个项目,我们需要每天处理几个xml文件,并使用这些文件中包含的信息填充数据库.

每个文件大约1Mb,包含大约1000条记录; 我们通常需要处理12到25个这些文件.我已经看到了一些关于使用NHibernate的批量插入的信息,但是我们的问题在某种程度上比较棘手,因为xml文件包含与更新记录混合的新记录.

在xml中有一个标志,告诉我们特定记录是新记录还是对现有记录的更新,但不是更改了哪些信息.xml记录不包含我们的数据库标识符,但我们可以使用xml记录中的标识符来唯一地定位数据库中的记录.

到目前为止,我们的策略是确定当前记录是插入还是更新,并且基于我们在数据库上执行插入或者我们进行搜索,然后我们使用来自的信息来更新对象的信息. xml记录,最后我们对DB进行更新.

我们当前的方法存在的问题是我们遇到了数据库锁问题,而且我们的性能下降得非常快.我们已经考虑过一些替代方案,比如为不同的操作设置单独的表,或者甚至是单独的数据库,但是做出这样的举动意味着要做出很大的努力,所以在做出任何决定之前我想先询问社群对这个问题的看法,提前感谢.

.net c# nhibernate bulkinsert

7
推荐指数
1
解决办法
1万
查看次数

右键单击并使用以管理员身份运行时,%CD%变量行为会有所不同

我有一个Windows cmd文件,它使用%CD%环境变量来确定cmd文件的执行目录.

当我从命令行运行cmd文件时,它正常工作,这意味着%CD%变量包含工作目录.如果我双击左键单击cmd它也可以正常工作.但是,如果我右键单击cmd文件并选择runas administrator,则%CD%变量包含值"C:\ Windows\system32"而不是cmd正在执行的curent目录.

我能够使用以下脚本重现该问题:

echo %CD%
pause
Run Code Online (Sandbox Code Playgroud)

windows cmd batch-file

6
推荐指数
1
解决办法
9588
查看次数

QueryOver的NHibernate二级缓存问题

当我使用Session.Get()时,我有二级缓存工作正常但是如果我在NH3.0中使用新的QueryOver API,缓存不会被命中.

这非常有效:

public TEntity Get(int id)
{
  return session.Get<TEntity>(id);
}
Run Code Online (Sandbox Code Playgroud)

这不会达到缓存:

public TEntity Get(Expression<Func<TEntity bool>> filter)
{
    var query = _session.QueryOver<TEntity>()
                .Where(filter);

    query.Cacheable();     
    return query.SingleOrDefault();
}
Run Code Online (Sandbox Code Playgroud)

我正在使用事务来确保正确使用二级缓存.

这是我的Session配置:

Session = Fluently.Configure()
                .Database(SQLiteConfiguration.Standard.InMemory().ShowSql())
                .Mappings(x => x.FluentMappings.AddFromAssemblyOf<Activity>())
                .Cache(c => c.UseSecondLevelCache()
                            .UseQueryCache()
                            .ProviderClass<NHibernate.Cache.HashtableCacheProvider>())
                .ExposeConfiguration(cfg => configuration = cfg)
                .BuildSessionFactory()
                .OpenSession();
Run Code Online (Sandbox Code Playgroud)

我正在为缓存使用设置我的实体:

public class CommentMap : ClassMap<Comment>
    {
        public CommentMap()
        {
            Cache.ReadWrite();

            Id(x => x.Id);
            Map(x => x.Message);
            References(x => x.Activity);
            References(x => x.User);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我在QueryOver查询上调用Cacheable方法:

public TEntity Get(Expression<Func<TEntity, bool>> filter)
        { …
Run Code Online (Sandbox Code Playgroud)

nhibernate fluent-nhibernate

2
推荐指数
1
解决办法
2507
查看次数