小编Dan*_*ing的帖子

如何使用Fluent NHibernate创建聚簇索引?

我正在使用Fluent-NHibernate(使用自动化)来生成我的表,但是想要选择与默认使用的ID字段不同的聚簇索引.如何在默认主键字段以外的字段上使用Fluent NHibernate创建聚簇索引?

这背后的主要原因很简单.我正在使用Guids作为我的主键字段.默认情况下,NHibernate在主键字段上创建聚簇索引.由于Guids通常不是顺序的,因此主键字段上的群集会导致性能问题.

众所周知,在表格末尾附加记录比在表格中插入记录要便宜得多.此外,表中的记录按聚集索引中的项目顺序物理存储.由于Guids有点"随机"而且不是顺序的,因此可能会生成小Guid,这些Guid小于表中已有的其他Id Guids的值 - 导致表插入而不是追加.

为了最小化这个,我有一个名为CreatedOn的列,其类型为DateTime.我需要将表聚集在此CreatedOn列上,以便附加所有新记录而不是插入.

欢迎任何有关如何实现这一目标的想法!

注意:我意识到我可以使用顺序指南,但出于安全原因,我不想走这条路.


注意:我仍然没有这篇文章的答案,但我现在有一些想法,我正在思考.

  1. 使用NHibernate而不使用Fluent,我认为可以直接在NHibernate中创建聚簇索引.我还不太了解NHibernate知道如何做到这一点.我很漂亮(几乎绝对是)确定它可以完成.

  2. Fluent-NHibernate过去常常包含一种在最近重写之前在SQL对象上设置属性(例如像聚簇索引)的方法.现在这个选项似乎已经消失了.我可能会在某处发布一个问题,看看该选项是否仍然可用.如果是这样,我可能会使用它来设置聚集索引.

  3. Fluent-NHibernate能够在流畅构建后公开配置以进行手动编辑.我没有尝试过这个功能,但希望它可以提供设置聚簇索引所需的粒度级别.

  4. 在最糟糕的情况下,我可以编写一个SQL脚本来在生成所有表后更改聚簇索引.但是,我对这种方法有几个问题.答:由于我使用自动模式生成,NHibernate会在下次评估配置时"撤消"我的聚簇索引吗?2.如果检测到聚簇索引已更改,NHibernate会出错吗?我需要测试一下,但还没有这样做.我真的很讨厌这个解决方案.我正在测试我的数据库对SQLServer2008和MySQL.NHibernate的一部分优点是它与数据库无关.一旦我们介绍了脚本,所有的赌注都会被取消.

  5. 在一个名为IPropertyInstance Classes的流畅约定中使用了一个接口,该接口从此接口继承了一个Index属性,该属性允许在该字段上创建索引.问题是没有标志或其他选项允许将索引创建为群集.最简单的解决方案是向此方法添加属性以允许创建聚簇索引.我想我可以向Fluent-NHibernate开发人员提出建议.

nhibernate fluent-nhibernate automapping clustered-index

3
推荐指数
1
解决办法
2710
查看次数

自动映射uri到字符串约定

使用Automapper,设置全局约定的最佳方法是什么,以便将所有System.Uri属性转换为表示AbsoluteUri属性的字符串?

理想情况下,我想将一个null System.Uri解析为值String.Empty而不是null.

automapper

3
推荐指数
1
解决办法
449
查看次数

System.Reflection - 如何调用次级类型的getter方法?

我有三节课:

public class TestA
{
    public string Str1 { get; set; }
    public string Str2 { get; set; }
    public TestB TestB { get; set; }

    public TestA()
    {
        Str1 = "string1";
        Str2 = "string2";
        TestB = new TestB();
    }
}

public class TestB
{
    public string Str3 { get; set; }
    public string Str4 { get; set; }
    public TestC ObjTestC { get; set; }
    public TestB()
    {
        Str3 = "string3";
        Str4 = "string4";
        ObjTestC = new TestC();
    } …
Run Code Online (Sandbox Code Playgroud)

.net c# reflection system.reflection

3
推荐指数
1
解决办法
4279
查看次数

Nhibernate中的子查询

我有以下结构.

1)GroupMember.cs

    public class GroupMember
    {        
        public virtual int Id { get; set; }
        public virtual SystemUser User { get; set; }
        public virtual Group Group { get; set; }
        public virtual IList<Group> GroupDetail { get; set; }
        public virtual IList<SystemUser> SystemUserDetail { get; set; }

       // Few more Properties are there
    }        
Run Code Online (Sandbox Code Playgroud)

2)SystemUser.cs

   public class SystemUser
   {       
       public virtual int Id{get;set;}            
       public virtual string DisplayName{get;set;}            
       // Few more Properties are there
   }
Run Code Online (Sandbox Code Playgroud)

Nhibernate文件

小组成员

            <?xml version="1.0" encoding="utf-8" ?>
            <hibernate-mapping …
Run Code Online (Sandbox Code Playgroud)

linq nhibernate

3
推荐指数
1
解决办法
2921
查看次数

带有命名参数问题的 NHibernate CreateSQLQuery()

在我的情况下,为什么命名或位置查询参数不适用于 NHibernate?

认为以下陈述是正确的:

在 Oracle 数据库 X 和 Y 版本 11.2.0.3.0 上,存在由“MyPassword”标识的角色“MyRole”,并授予我连接的用户。

这是一些代码:

public void SetRole(string roleName, string rolePassword)
{
    if (HasRoleBeenSet) return;
    try
    {
        session.CreateSQLQuery("SET ROLE ? IDENTIFIED BY ?")
               .SetString(0, roleName)
               .SetString(1, rolePassword)
               .ExecuteUpdate();
        HasRoleBeenSet = true;
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

SetRole("MyRole", "MyPassword");
Run Code Online (Sandbox Code Playgroud)

抛出以下异常:

NHibernate.Exceptions.GenericADOException:无法执行本机批量操作查询:SET ROLE?由 ? [SQL: SET ROLE :p0 IDENTIFIED BY :p1] ---> System.Data.OracleClient.OracleException: ORA-01937: 角色名称丢失或无效

当我使用 Toad 套件中包含的 SQLMonitor 时,发送到数据库的 SQL 如下所示SET ROLE ? IDENTIFIED BY ?,错误Error occurred: …

oracle nhibernate ado.net parameterized-query

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