标签: nhibernate-mapping

13
推荐指数
1
解决办法
8556
查看次数

当cascade是delete-all-orphan时,如何更改NHibernate中孩子的父级?

我有两个双向一对多关系的实体:

public class Storage
{
    public IList<Box> Boxes { get; set; }
}

public class Box
{
    public Storage CurrentStorage { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和映射:

<class name="Storage">
    <bag name="Boxes" cascade="all-delete-orphan" inverse="true">
        <key column="Storage_Id" />
        <one-to-many class="Box" />
    </bag>
</class>

<class name="Box">
    <many-to-one name="CurrentStorage" column="Storage_Id" />
</class>
Run Code Online (Sandbox Code Playgroud)

A Storage可以有很多Boxes,但Box只能属于一个Storage.我将它们映射,以便一对多有一个级联all-delete-orphan.

当我尝试更换Box时,我的问题就出现了Storage.假设我已经运行了这段代码:

var storage1 = new Storage();
var storage2 = new Storage();
storage1.Boxes.Add(new Box());

Session.Create(storage1);
Session.Create(storage2);
Run Code Online (Sandbox Code Playgroud)

以下代码将给我一个例外:

// get the first …
Run Code Online (Sandbox Code Playgroud)

nhibernate cascade nhibernate-mapping

13
推荐指数
1
解决办法
2704
查看次数

将Hibernate过滤器属性应用于具有多对多关系的Bag

考虑以下Hibernate映射文件:

<hibernate-mapping ...>
<class name="ContentPackage" table="contentPackages">
    <id name="Id" column="id" type="int"><generator class="native" /></id>
    ...
    <bag name="Clips" table="contentAudVidLinks">
      <key column="fk_contentPackageId"></key>
      <many-to-many class="Clip" column="fk_AudVidId"></many-to-many>
      <filter name="effectiveDate" condition=":asOfDate BETWEEN startDate and endDate"  />
    </bag>
</class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

当我运行以下命令时:

  _session.EnableFilter("effectiveDate").SetParameter("asOfDate", DateTime.Today);

  IList<ContentPackage> items = _session.CreateCriteria(typeof(ContentPackage))
                                     .Add(Restrictions.Eq("Id", id))
                                     .List<ContentPackage>();
Run Code Online (Sandbox Code Playgroud)

生成的SQL在中间映射表(contentAudVidLinks)上有WHERE子句,而不是"Clips"表,即使我已将过滤器属性添加到Bag of Clips中.

我究竟做错了什么?

nhibernate hibernate nhibernate-mapping

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

为什么流利的NHibernate与hbm XML文件?

虽然这是一个主观问题,但作为一个新的NHibernate用户,我很好奇为什么会选择Fluent与传统的XML映射.

从我的观点来看,当我第一次使用NHibernate时,我使用了Fluent界面,但遇到了一些障碍,很难找到适合Fluent界面的文档,除了"玩具应用程序"之外,所以我学会了处理这些XML.

随着时间的推移,我意识到我在XML方面完成了大部分工作,并意识到它并不像我想象的那样可怕.所以对我个人来说,这是一个文档很差的情况,并没有看到编码时间的显着节省.

话虽如此,我可能会有一些巨大的优势/劣势,我很想听到那些在使用这些工具方面有更多经验的人的意见.

nhibernate nhibernate-mapping fluent-nhibernate

12
推荐指数
2
解决办法
2664
查看次数

IndexOutOfRangeException在NHibernate的深处

我有以下映射:

public class SecurityMap : ClassMap<Security>
    {
        public SecurityMap()
        {
            Table("Security");
            CompositeId().KeyProperty(k => k.Id, "SecurityId").KeyProperty(k => k.EndDate);
            Map(x => x.LastUpdateUser);
            References(x => x.Company).Columns("CompanyId", "EndDate");
            References(x => x.PrimaryListing).Columns("PrimaryListingId", "EndDate");
         }
    }

public class ListingMap : ClassMap<Listing>
    {
        public ListingMap()
        {
            Table("Listing");
            CompositeId().KeyProperty(k => k.Id, "ListingID").KeyProperty(k => k.EndDate);
            References(x => x.Security).Columns("SecurityId","EndDate");
        }
    }

 public class CompanyMap : ClassMap<Company>
    {
        public CompanyMap()
        {
            Table("Company");
            CompositeId().KeyProperty(k => k.Id, "CompanyID").KeyProperty(k => k.EndDate);
            HasMany(x => x.Securities).KeyColumns.Add("CompanyId", "EndDate");
        }       
    }
Run Code Online (Sandbox Code Playgroud)

当我尝试运行此测试时:

[Test]
public void can_update_a_security()
{
    var …
Run Code Online (Sandbox Code Playgroud)

mapping nhibernate exception nhibernate-mapping fluent-nhibernate

12
推荐指数
1
解决办法
8212
查看次数

NHibernate一对一映射

我是NHibernate的新手所以到目前为止对映射等的接触有限,而且我刚刚遇到了一个我需要一些帮助的场景.

我有2张桌子:

评论TaggedReviews

我有2个看起来像这样的类(为简洁起见,我排除了非重要属性):

评论

public virtual int ReviewId { get; set; }
public virtual TaggedReview TaggedReview { get; set; }
public virtual string Title { get; set; }
public virtual string Descrip { get; set; }
Run Code Online (Sandbox Code Playgroud)

TaggedReview

public virtual int ReviewId { get; set; }
public virtual Review Review { get; set; }
public virtual string TaggedReviewDescrip { get; set; }
Run Code Online (Sandbox Code Playgroud)

我的NHibernate这些表/类的XML映射文件目前如下(为简洁起见编辑):

Review.hbm.xml

<class xmlns="urn:nhibernate-mapping-2.2" name="Review" table="Reviews">
    <id name="ReviewId" unsaved-value="0">
        <column name="ReviewId"></column>
        <generator class="native" />
    </id>

    <property name="Title" not-null="true" …
Run Code Online (Sandbox Code Playgroud)

c# asp.net nhibernate nhibernate-mapping

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

你如何让NHibernate忽略POCO中的属性

我们有POCO,类似于:

public class Person
{
    public Guid PersonID { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public DateTime DateOfBirth { get; set; }

    public string   Version {get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和相应的hbm文件一样

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernate.FirstAttempt"  namespace="NHibernate.FirstAttempt.Entity" >
  <class name="Person" lazy="false">
    <id name="PersonID">
      <generator class="guid" />
    </id>
    <property name="FirstName"  />
    <property name="LastName"     />
    <property name="DateOfBirth"  />
  </class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

仔细观察,我们有一个Version属性,数据库中没有列?我们只是希望nHibernate忽略这个属性,这就是我们没有将属性放在映射文件中的原因.但相反,它开始抛出错误.

有没有解决的办法 ?

.net c# nhibernate-mapping

12
推荐指数
1
解决办法
9456
查看次数

命名查询未知错误尝试使用Fluent NHibernate调用存储过程

我正在为一个项目设置NHibernate,我有一些查询,由于它们的复杂性,我们将作为存储过程离开.我希望能够使用NHibernate来调用sprocs,但遇到了一个我无法弄清楚的错误.由于我正在使用Fluent NHibernate,我正在使用此处推荐的混合模式映射.但是,当我运行应用程序时,我得到一个"命名查询未知:AccountsGetSingle"异常,我无法弄清楚原因.我想我的HBM映射可能有问题,因为我对使用它们并不是很熟悉,但我不确定.

我的NHibernate配置代码是:

private ISessionFactory CreateSessionFactory()
{
    return Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2005
            .ConnectionString((conn => conn.FromConnectionStringWithKey("CIDB")))
                .ShowSql())
        .Mappings(m => 
            {
                m.HbmMappings.AddFromAssemblyOf<Account>();
                m.FluentMappings.AddFromAssemblyOf<Account>();
            })
        .BuildSessionFactory();
}
Run Code Online (Sandbox Code Playgroud)

我的hbm.xml文件是:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <sql-query name="AccountsGetSingle">
        <return alias="Account" class="Core, Account"></return>
        exec AccountsGetSingle
    </sql-query>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

我调用sproc的代码如下所示:

public Account Get()
{
    return _conversation.Session
        .GetNamedQuery("AccountsGetSingle")
        .UniqueResult<Account>();
}
Run Code Online (Sandbox Code Playgroud)

任何想法或想法将不胜感激.谢谢.

更新: @kibbled_bits的建议让我得到我正在寻找的最终结果(能够从NHibernate调用存储过程),但我仍然不知道为什么我上面列出的方法不起作用.我仍然很好奇为什么,因为它可以为未来的问题提供有价值的见解.

nhibernate nhibernate-mapping fluent-nhibernate

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

流畅的nHibernate自动化属性为nvarchar(max)

使用流畅的nhibernate和自动化(nhibernate创建我的数据库模式),我怎样才能获得nhibernate在数据库中基于以下类创建一个nvarchar(max)列

public class VirtualPage : BaseEntity
{
    public virtual int ParentId { get; set; }
    public virtual string PageName { get; set; }
    public virtual string Title { get; set; }
    public virtual string Body { get; set; }
    public virtual string ViewName { get; set; }
    public virtual string ViewData { get; set; } // this must be nvarchar(max)
}
Run Code Online (Sandbox Code Playgroud)

c# nhibernate-mapping fluent-nhibernate

11
推荐指数
1
解决办法
8879
查看次数

流畅的NHibernate N + 1问题与复杂的对象

我有一个问题,NHibernate查询数据库的方式太多次了.我刚刚意识到它可能与n + 1问题有关,但我无法弄清楚如何改变我的映射来解决问题.

正如您将看到的,我的尝试涉及指定不延迟加载其他对象,但它似乎没有做到这一点.

这是查询:

public IQueryable<Report> ReadAll(DateTime since)
{
    return m_session.QueryOver<Report>()
       .JoinQueryOver(r => r.Mail)
       .Where(m => m.Received >= since)
       .List()
       .AsQueryable();
}
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的回复!如果您需要有关我的对象或映射的更多信息,请告诉我们.

简化对象图(一些省略):

public class Report : EntityBase
{
    public virtual Product Product { get; set; }
    public virtual StackTrace StackTrace { get; set; }
    public virtual Mail Mail { get; set; }

    public virtual IList<ClientUser> ReadBy { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

-

public class Product : EntityBase
{
    public virtual string Name { get; set; }
    public …
Run Code Online (Sandbox Code Playgroud)

nhibernate nhibernate-mapping fluent-nhibernate

11
推荐指数
1
解决办法
612
查看次数