标签: nhibernate-mapping

NHibernate映射与类层次结构,其基类是抽象的,鉴别器不是字符串

以下是域模型类:

public abstract class BaseClass
{
...
}

public class ChildClass : BaseClass
{
...
}
Run Code Online (Sandbox Code Playgroud)

请注意,父类是抽象的,这就是在使用流畅的nhibernate进行映射时给我带来一些困难的原因.我的鉴别器是一个字节(数据库中的tinyint).因为它不是一个字符串,我不能管理设置在基类中的鉴别值,这并不工作(从映射类BaseClass的拍摄):

DiscriminateSubClassesOnColumn<byte>("Type")
    .SubClass<ChildClass>()
    .IsIdentifiedBy((byte)OperationType.Plan)
    .MapSubClassColumns(p => { ... })
Run Code Online (Sandbox Code Playgroud)

我得到的错误信息是:

类初始化方法UnitTest1.MyClassInitialize引发异常.NHibernate.MappingException:NHibernate.MappingException:无法格式鉴别价值实体的BaseClass的SQL字符串---> System.FormatException:输入字符串的不正确的格式..

以下帖子似乎解释了会发生什么.他们给使用XML的解决方案,但不与功能NHibernate:http://forum.hibernate.org/viewtopic.php?t=974225

谢谢您的帮助.

c# nhibernate domain-driven-design nhibernate-mapping fluent-nhibernate

9
推荐指数
1
解决办法
8406
查看次数

NHibernate HiLo - 每个实体的新列和HiLo捕获

我目前正在为我的课程使用hilo id生成器,但刚刚使用了最少的设置,例如


<class name="ClassA">
    <id name="Id" column="id" unsaved-value="0">
      <generator class="hilo" />
    </id>
...

但是我真的要为NHibernate指定一个新列来使用foreach实体并为它提供最大值吗?


<class name="ClassA">
    <id name="Id" column="id" unsaved-value="0">
      <generator class="hilo">
        <param name="table">hibernate_unique_key</param>
        <param name="column">classA_nexthi</param>
        <param name="max_lo">20</param>
      </generator>
    </id>
...
<class name="ClassB">
    <id name="Id" column="id" unsaved-value="0">
      <generator class="hilo">
        <param name="table">hibernate_unique_key</param>
        <param name="column">classB_nexthi</param>
        <param name="max_lo">20</param>
      </generator>
    </id>
...
Run Code Online (Sandbox Code Playgroud)

另外我注意到,当我执行上述操作时,SchemaExport将不会创建所有列 - 只有classB_nexthi,还有其他我做错了.

nhibernate nhibernate-mapping hilo

9
推荐指数
1
解决办法
4301
查看次数

在NHibernate,Fluent NHibernate和SQL Server 2008中使用Time列

我的SQL Server 2008数据库中有一个包含时间列的表.

我想要映射到的对象的属性是TimeSpan.

我如何告诉FluentNHibernate使用TimeAsTimeSpan NHibernate类型,以便我没有演员问题?

nhibernate nhibernate-mapping fluent-nhibernate sql-server-2008

9
推荐指数
2
解决办法
3550
查看次数

流畅的NHibernate +多个数据库

我的项目需要处理三个数据库,这意味着三个会话工厂.问题是如果我用流利的nhibernate做这样的事情:

.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()))
Run Code Online (Sandbox Code Playgroud)

工厂将获取所有映射,甚至是与另一个数据库相对应的映射

我已经看到,当使用自动化时,您可以执行类似的操作,并按命名空间过滤:

.Mappings(m => m.AutoMappings.Add(
    AutoMap
       .AssemblyOf<Product>()
       .Where(t => t.Namespace == "Storefront.Entities")))
Run Code Online (Sandbox Code Playgroud)

我没有找到这样的流利映射,是否有可能?我能想到的唯一解决方案是:为每个db映射类创建单独的程序集,或者将每个实体显式添加到工厂配置中.

如果可能的话,我宁愿避免这两种情况.谢谢.

.net nhibernate nhibernate-mapping fluent-nhibernate

9
推荐指数
2
解决办法
5965
查看次数

NHibernate - 在创建和更新时自动生成时间戳?

我试图在NHibernate中映射一个实体,它应该有一个更新的列.这应该是实体最后写入数据库(创建或更新)时的DateTime.我希望NHibernate能够控制列的更新,所以我不需要记得在更新之前将属性设置为当前时间.

NHibernate中是否有内置功能,可以为我处理这个问题?

nhibernate nhibernate-mapping

9
推荐指数
1
解决办法
3002
查看次数

如何从FluentNHibernate生成hbm.xml文件

我想按照这个教程,但不是与我在它映射产生预期的hbm.xml文件中为我的实体,如例如产生简单的.cs类:

public class ProductMap : ClassMap<Product>
Run Code Online (Sandbox Code Playgroud)

但我已经在代码中定义了这些.我正在使用.hbm.xml,我现在可以在标准NHibernate中使用它.

这就是我设置SessionFactory的方法:

    private static ISessionFactory CreateSessionFactory()
    {
        String schemaExportPath = Path.Combine(System.Environment.CurrentDirectory, "Mappings");

        if (!Directory.Exists(schemaExportPath))
            Directory.CreateDirectory(schemaExportPath);


        return Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2008
                .ConnectionString(c =>c.FromConnectionStringWithKey("connectionString"))
                .Cache(c => c.UseQueryCache()
                    .ProviderClass<HashtableCacheProvider>()).ShowSql())
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Program>().ExportTo(schemaExportPath))
            .ExposeConfiguration(c => new SchemaExport(c).SetOutputFile(@"c:\temp\test.sql").Create(false, true))
            .BuildSessionFactory();
    }
Run Code Online (Sandbox Code Playgroud)

nhibernate nhibernate-mapping fluent-nhibernate hbmxml

9
推荐指数
1
解决办法
2656
查看次数

在NHibernate中将多个鉴别器值映射到单个默认类

我有一个包含数据的现有RoleType表.我试图使用每个类层次结构的表在NHibernate中映射此表:

<class name="IRoleType" table="RoleType">

  <id name="Id" column="RoleID">
    <generator class="native" />
  </id>

  <discriminator column="RoleID" />    

  <property name="Description" column="Description" />
  <!-- ... more properties ... -->

  <subclass name="RoleA" discriminator-value="1" />
  <subclass name="RoleB" discriminator-value="4" />
  <subclass name="RoleC" discriminator-value="7" />
</class>
Run Code Online (Sandbox Code Playgroud)

这里,IRoleType是一个接口,具有实现者RoleA,RoleBRoleC.这有效.但这是问题 -

该表包含具有"额外"鉴别器值(2,3,5,6)的行,这些行未映射到持久类.这些值在域中已弃用,因此为每个值创建持久类没有用.但我们也无法从数据库中删除它们.

有没有办法将这些额外的行映射到单个"默认"类?如果没有,我还能怎样解决这个问题?

谢谢!

nhibernate inheritance nhibernate-mapping

9
推荐指数
1
解决办法
4670
查看次数

NHibernate AssertException:Interceptor.OnPrepareStatement(SqlString)返回null或空SqlString

我正在尝试将表从多对一映射切换为具有中间映射表的多对多映射.但是,当我切换它并试图用NHibernate对它进行查询时,它给了我这个错误:"Interceptor.OnPrepareStatement(SqlString)返回null或空SqlString."

我的查询最初是一些更复杂的问题,但是我将其切换为基本的提取全部并且我仍然遇到问题:

Session.QueryOver<T>().Future();
Run Code Online (Sandbox Code Playgroud)

它似乎是我的模型映射文件中的问题或我的数据库中的某些东西.

这是我的模型映射:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="GBI.Core" namespace="GBI.Core.Models">

<class name="Market" table="gbi_Market">
    <id name="Id" column="MarketId">
        <generator class="identity" />
    </id>
    <property name="Name" />
    <property name="Url" />
    <property name="Description" type="StringClob" />
    <property name="Rating" />
    <property name="RatingComment" />
    <property name="RatingCommentedOn" />
    <many-to-one name="RatingCommentedBy" column="RatingCommentedBy" lazy="proxy"></many-to-one>
    <property name="ImageFilename" />
    <property name="CreatedOn" />
    <property name="ModifiedOn" />
    <property name="IsDeleted" />

    <many-to-one name="CreatedBy" column="CreatedBy" lazy="proxy"></many-to-one>
    <many-to-one name="ModifiedBy" column="ModifiedBy" lazy="proxy"></many-to-one>

    <set name="Content" where="IsDeleted=0 and ParentContentId is NULL" order-by="Ordering asc, CreatedOn asc, Name asc" lazy="extra"> …
Run Code Online (Sandbox Code Playgroud)

nhibernate nhibernate-mapping interceptor

9
推荐指数
1
解决办法
5516
查看次数

FluentNHibernate映射; 无法使用比例/精度映射双精度或小数

我第一次使用FluentNHibernate,尝试将类映射到SQL Express数据库.通常它可以工作,但我无法将Double或Decimal属性类型映射到特定的比例/精度.下面显示了我使用SchemaUpdate.Execute反复测试的单个属性的结果.在任何情况下我都无法让它发挥作用.

听到一些不符合我预期的映射的解释(2-8)真的很有帮助吗?

// Ok mappings:
Run Code Online (Sandbox Code Playgroud)

1)十进制:映射(函数(x)x.Balance)>>十进制(19,5 )

// Mappings "errors":
Run Code Online (Sandbox Code Playgroud)

2)Double:Map(Function(x)x.Balance).CustomSqlType("decimal") >> Decimal(18,0) - 为什么0 precision是这里的默认映射?

3)Double:Map(Function(x)x.Balance)>> Float,但是; 在运行SchemaValidator之后: HibernateException:FnhDb.dbo.Account中的列类型错误,用于列Balance.发现:浮动,预期双精度

4)十进制:映射(函数(x)x.Balance).Scale(9).精度(2) >> SqlException:列'Balance'的标度(9)必须在0到2的范围内.

5,6)十进制或双数:映射(函数(x)x.Balance).Scale(9).精度(2).CustomSqlType("numeric") >> numeric(18,0)

7,8)十进制或双精度:映射(函数(x)x.Balance).Scale(9).精度(2).CustomSqlType("decimal") >>十进制(18,0)


编辑: 我在这里包含代码和案例(4)的hbm.xml(导出):

Public Class AccountMap
    Inherits ClassMap(Of Account)

    Public Sub New()
        MyBase.New()

        Id(Function(x) x.Id).GeneratedBy.Identity()
        Map(Function(x) x.Balance).Scale(9).Precision(2)   
        Map(Function(x) x.Deposits)
        Map(Function(x) x.WithDrawals)
    End Sub
End Class

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" …
Run Code Online (Sandbox Code Playgroud)

.net database nhibernate nhibernate-mapping fluent-nhibernate

9
推荐指数
1
解决办法
7000
查看次数

级联错误:已删除的对象将通过级联重新保存

我有一个NHibernate实现的项目并使用Lazy Loading.我在这个项目中有两个班:人和家庭.这两者之间的关系是聚合,是指Person有一个Person列表.映射是:

  <class name="Person" table="Person_Person" >

    <id name="Id" type="Int64" unsaved-value="0">
      <generator class="native" />
    </id>

    <bag name="Families" inverse="true" table="Person_Family" cascade="all-delete-orphan" >
      <key column="Person_id_fk"/>
      <one-to-many class="Domain.Entities.Family,Domain.Entities"/>
    </bag>

  </class>
Run Code Online (Sandbox Code Playgroud)

在这个项目中,我通过ID获取一个人然后删除一个家庭的人.

Person person = SessionInstance.Get<Person>(id);
foreach (Family fam in person.Families)
    if (fam.Name == "Jaun")
        SessionInstance.Delete(fam);
Run Code Online (Sandbox Code Playgroud)

系列未删除,因为通过此消息抛出异常: deleted object would be re-saved by cascade (remove deleted object from associations)[Domain.Entities.Family#167]

我怎样才能删除一个人的家庭?

c# nhibernate cascade nhibernate-mapping nhibernate-cascade

9
推荐指数
1
解决办法
5753
查看次数