标签: nhibernate-mapping

NHibernate中的空值对象

我有一个包含Address作为值对象的person实体:

public Person()
{
    WithTable("Person");
    Id(x => x.Id);
    Component<Address>(x => x.Address, a =>
    {
        a.Map(x => x.Address1);
        a.Map(x => x.Address2);
        a.Map(x => x.Address3);
        a.Map(x => x.Town);
        a.Map(x => x.Postcode);
    });
}
Run Code Online (Sandbox Code Playgroud)

它在NHibernate文档中指出,如果值对象(Address1,Address2等)的所有属性都为null,则整个组件将被映射为null(即Person.Address将为null).这给了我所有地址字段为空的情况下的问题,因为在我的网页中我可能有(我正在做ASP MVC):

<%= Html.TextBoxFor((x => x.Address.Address1))%>
Run Code Online (Sandbox Code Playgroud)

这打破了空引用异常.所以我正在寻找一种简洁的方法将Address设置为一个新的Address()对象而不是null,如果我从数据库加载Person而不手动操作时所有字段都是空的.我打了以下想法:

在我的视图中进行空检查(yuk,可怕)

使数据库字段不可为空(我正在处理遗留数据库)

任何想法?

null nhibernate-mapping fluent-nhibernate value-objects

10
推荐指数
2
解决办法
3834
查看次数

多列多对一

我有一个遗留数据库和两个表之间的一对一关系.关键是关系使用两列,而不是一列.有没有办法在nhibernate中说,当获取一个被引用的实体时,它在join语句中使用了两列,而不是一个?我有一个类似的表结构

TaskProgress

  • ProgressId
  • 任务id
  • AssignmentId
  • 用户身份

任务

  • 任务id
  • AssignmentId
  • 任务名称

每个任务都可以在不同的任务中进行分配.这意味着任务进度的唯一任务只能由AssignmentId和TaskId字段建立.

我想用这个:

  References(x => x.Template)
            .Columns()
            .PropertyRef()
Run Code Online (Sandbox Code Playgroud)

但无法获得如何在多列上映射连接,任何想法?

c# nhibernate nhibernate-mapping fluent-nhibernate

10
推荐指数
1
解决办法
2359
查看次数

NHibernate.StaleStateException:意外的行数:0; 预期:1

Hl伙计们,

我正忙着为存在的系统编写后端管理程序.我已经为我的数据访问解决方案选择了NHibernate,并且它是相当新的.我在父/子关系中遇到以下错误:

NHibernate.StaleStateException:意外的行数:0; 预期:1

此错误是由于我的源代码中将新的子对象添加到父级的MeetingAdministrators子集合中.当我保存父对象时,我也希望添加子对象,但是只为父对象生成INSERT.Nhibernate不为子节点生成INSERT,而是尝试更新子节点,即使它不存在.因此,它会显示上面显示的错误消息.我已经浏览了网络上的各个地方和这个场景的nhibernate文档,但没有找到任何帮助.大多数代码涉及不属于主键的外键,或者人们似乎正在处理一对一或多对多关系.我需要指定映射和代码,以便在插入父项时,子项也会被插入.请帮忙.

我的数据结构如下:

会议 - 父表

  • MeetingID(pk)(int,identity)
  • 描述
  • 开始日期
  • 活跃
  • 地点

MeetingAdministrator - 子表

  • MeetingID(pk,fk)
  • AdminNetworkID(pk)(varchar)
  • 创建日期
  • 活跃

这是Visual Basic .NET源代码:

<Serializable()> _
Public Class MeetingAdministrator

    Private _MeetingID As Integer
    Public Overridable Property MeetingID() As Integer
        Get
            Return _MeetingID
        End Get
        Set(ByVal value As Integer)
            _MeetingID = value
        End Set
    End Property

    Private _AdminNetworkID As String
    Public Overridable Property AdminNetworkID() As String
        Get
            Return _AdminNetworkID
        End Get
        Set(ByVal value As String)
            _AdminNetworkID = value
        End Set
    End …
Run Code Online (Sandbox Code Playgroud)

nhibernate parent-child nhibernate-mapping

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

IPreUpdateEventListener和dynamic-update ="true"

我一直试图在Ayende的博客之后做一个非常简单的审计场景,这似乎是每个人在IPreUpdateEventListener和IPreInsertEventListener时所引用的资源.

然而,无论我怎么努力,我都无法让它发挥作用.事件正确启动,当我通过它时一切看起来都没问题,但是我的"更改时间"没有更新到数据库.

我花了大约一天google搜索这一点,并终于找到了答案在这里.

当您使用dynamic-update ="true"映射实体时,它将无法工作.果然,对我来说就是这样.既然我很难找到这条信息,那么使用dynamic-update ="true"是不常见的?我们在所有实体上使用它.

由于这对我们来说是一个重大障碍,我想问一下这有什么办法吗?

我一直在关注IInterceptor,但它总是被认为是过时的,那么这有什么缺点呢?另外,我还没有找到一个关于如何使用IInterceptor进行相同审计(使用插入/更新时间戳)的非常好的教程(我对NHibernate相当新).

任何帮助,将不胜感激!

nhibernate nhibernate-mapping

10
推荐指数
1
解决办法
2218
查看次数

如何使NHibernate停止使用nvarchar(4000)插入参数字符串?

我需要优化域实体上的保存(插入查询)生成的查询.我已经使用Fluent NHibernate配置了NHibernate.

这是NHibernate在插入用户对投票的响应时生成的查询:

exec sp_executesql N'INSERT INTO dbo.Response (ModifiedDate, IpAddress, CountryCode, 
IsRemoteAddr, PollId) VALUES (@p0, @p1, @p2, @p3, @p4); select SCOPE_IDENTITY()',N'@p0
datetime,@p1 nvarchar(4000),@p2 nvarchar(4000),@p3 bit,@p4 int',
@p0='2001-07-08 03:59:05',@p1=N'127.0.0.1',@p2=N'US',@p3=1,@p4=2
Run Code Online (Sandbox Code Playgroud)

如果观察的输入参数IpAddressCountryCode,将会注意到,NHibernate的使用nvarchar(4000).问题是,nvarchar(4000)远远大于我需要或者IpAddressCountryCode并且由于高流量和托管的要求,我需要优化内存使用情况的数据库.

以下是这些列的Fluent NHibernate自动映射覆盖:

    mapping.Map(x => x.IpAddress).CustomSqlType("varchar(15)");
    mapping.Map(x => x.CountryCode).CustomSqlType("varchar(6)");
Run Code Online (Sandbox Code Playgroud)

这不是我看到不必要的nvarchar(4000)弹出的唯一地方.

如何控制NHibernatenvarchar(4000)对字符串表示的使用?

如何更改此insert语句以使用适当大小的输入参数?

sql-server nhibernate hibernate nhibernate-mapping fluent-nhibernate

10
推荐指数
1
解决办法
3523
查看次数

命名查询未知

我在NHibernate中有一个映射,如下所示:

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

    <class name="News" table="News">
       <property name="NewsId" type="Int64" column="NewsId"   />
       <property name="NewsTitle" type="String" column="NewsTitle"  />
    </class>

    <sql-query name="Sp_News">
           <return class="News" />
           exec Sp_News
    </sql-query>

</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

当我打电话时,session.GetNamedQuery("Sp_News")我收到以下错误:

Named query not known: Sp_News.
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激.

nhibernate nhibernate-mapping

10
推荐指数
1
解决办法
8376
查看次数

Sql视图的流畅Nhibernate映射

我在asp.net mvc3中使用Fluent Nhibernate与c#

我正在按照以下方式生成并映射一个类

制图

using FluentNHibernate.Mapping;
using Com.Web.Domain;

   namespace Com.Web.Mapping
      {
         public class CompanyMap : ClassMap<Company>
        {
             public CompanyMap()
            {
               Id(x => x.id);
               Map(x => x.Name);
              }
          }
       }
Run Code Online (Sandbox Code Playgroud)

     using System.Collections.Generic;
     using System;

      namespace Com.Web.Domain
      {

          public class Company
         {

          public virtual int id { get; set; }
          public virtual string Name{get;set}

           }

        }
Run Code Online (Sandbox Code Playgroud)

并在配置文件中

  private static void InitializeSessionFactory()
    {

       _sessionFactory = Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2008
                          .ConnectionString(local)

            )
            .Mappings(m =>
                      m.FluentMappings
                          .AddFromAssemblyOf<Company>())
            .ExposeConfiguration(cfg => new SchemaExport(cfg)
            .Create(false, false))  // this …
Run Code Online (Sandbox Code Playgroud)

nhibernate asp.net-mvc nhibernate-mapping fluent-nhibernate fluent-nhibernate-mapping

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

如何从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
查看次数

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
查看次数