标签: nhibernate-mapping

NHibernate映射 - 一对一(或一对零)

NHibernatians!

我有一张桌子[dbo].[Wibble]和另一张桌子[dbo].[WibbleExtended].

[Wibble]是主表,[WibbleExtended]是一个可选表,其中存储了一些其他字段.[WibbleExtended]表中的条目远少于主[Wibble]表.我认为这是在当天完成的,以解决一些空间问题(Wibble有很多行,而WibbleExtened有很多列).

每个表的ID都是相同的,来自外部源.

[dbo].[Wibble].[WibbleId]
Run Code Online (Sandbox Code Playgroud)

[dbo].[WibbleExtended].[WibbleId]
Run Code Online (Sandbox Code Playgroud)

是相同的,这两个表是如何相关的.

注意我无法更改架构.我对这个我几乎无法控制的遗留系统非常感兴趣.

在它周围搜索似乎一对一的映射是有问题的,并且流行的智慧是使用两个多对一映射.

我的映射目前是:

<class name="Wibble" table="Wibble" >
   <id name="Id" column="WibbleId" type="Int32">
      <generator class="assigned"/>
   </id>

   <many-to-one name="WibbleExtended" class="WibbleExtended" column="WibbleId" not-null="false" cascade="all"/>
</class>
Run Code Online (Sandbox Code Playgroud)

<class name="WibbleExtended" table="WibbleExtended" >
   <id name="Id" column="WibbleId" type="Int32">
        <generator class="assigned" />
   </id>

   <many-to-one name="Wibble" class="Wibble" column="WibbleId" not-null="true" />     
 </class>
Run Code Online (Sandbox Code Playgroud)

这个问题是我遇到了诸如此类的错误

System.IndexOutOfRangeException: Invalid index n for this SqlParameterCollection with Count=n.
Run Code Online (Sandbox Code Playgroud)

我环顾四周,看起来确实是正确的策略,它只是落在了最后的障碍.

问题是id生成器吗?映射的其他方面?

正确答案的免费碎肉馅饼.

编辑:好的 - 这就是我通过@James Gregory解决这个问题的方法.

  1. 将单元测试从WibbleExtended测试移至Wibble测试类并进行必要的修改.

  2. 在Wibble.hbm.xml中添加了以下内容

    <join table="WibbleExtended" optional="true">
         <key column="WibbleId"/>
         <property name="Blah1" column="Blah1" type="String" length="2000" not-null="false" …
    Run Code Online (Sandbox Code Playgroud)

c# nhibernate nhibernate-mapping

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

具有多个相同类型的多对多列表的Nhibernate实体?

有没有人知道我如何映射具有相同子类型的两个多对多集合的实体.

我的数据库结构是这个....

"正常"关系将是....

tbl_Parent
  col_Parent_ID

tbl_Parent_Child_Xref
   col_Parent_ID
   col_Child_ID

tbl_Child
   col_Child_ID
Run Code Online (Sandbox Code Playgroud)

替代关系是......

tbl_Parent
  col_Parent_ID

tbl_Include_ParentChild_Xref
   col_Parent_ID
   col_Child_ID

tbl_Child
   col_Child_ID
Run Code Online (Sandbox Code Playgroud)

实体和映射看起来像这样......

public partial class ParentEntity : AuditableDataEntity<ParentEntity>
{
  public virtual IList<ChildEntity> Children { get; set; }
  public virtual IList<ChildEntity> IncludedChildren { get; set; }
}

public partial class ParentMap : IAutoMappingOverride<ParentEntity>
{
    public void Override(AutoMapping<ParentEntity> mapping)
    {
        mapping.Table("tbl_Parent");

        mapping.HasManyToMany(x => x.Children)
        .Table("tbl_Parent_Child_Xref")
        .ParentKeyColumn("col_Parent_ID")
        .ChildKeyColumn("col_Child_ID")
        .Inverse()
        .Cascade.All();

        mapping.HasManyToMany(x => x.IncludedChildren)
        .Table("tbl_Include_ParentChild_Xref")
        .ParentKeyColumn("col_Parent_ID")
        .ChildKeyColumn("col_Child_ID")
        .Inverse()
        .Cascade.All();
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是 "System.NotSupportedException:无法弄清楚多少属性'孩子'的另一面应该是什么."

我正在使用NHibernate 2.1.2,FluentNhibernate 1.0.

nhibernate nhibernate-mapping fluent-nhibernate

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

NHibernate自定义集合类型

我正在调用一个实体对象,Patient并且该实体具有一个名为Visitstype 的属性VisitsCollection.

VisitsCollections是一个子类,IList<Visit>但它也为集合添加了一些自定义逻辑(如自动排序,一些验证,通知等).

需要使用自定义集合类型,因为它会将一些数据添加到添加到集合中的实体,并透明地执行其他一些文书工作.

现在我想在NHibernate中映射它,所以我创建了:

<list name="Visits" lazy="true" fetch="select">
    <key foreign-key="PatientId" />
    <index column="Timestamp" />
    <one-to-many class="Visit" not-found="ignore"/>
</list>
Run Code Online (Sandbox Code Playgroud)

我得到一个例外:

无法将'NHibernate.Collection.PersistentList'类型的对象强制转换为'... VisitsCollection'

每当我访问访问属性.

我也尝试过以这种方式映射它:

<list name="Visits" lazy="true" fetch="select" collection-type="VisitsCollection">
    <key foreign-key="PatientId" />
    <index column="Timestamp" />
    <one-to-many class="Visit" not-found="ignore"/>
</list>
Run Code Online (Sandbox Code Playgroud)

但是,我还是得到了这个例外:

自定义类型未实现UserCollectionType:..... VisitsCollection

我不想VisitsCollection从任何NHibernate类型继承我,因为集合类是我希望它与DAL无关的框架的一部分(因为它将在许多场景中使用 - 不仅仅用于数据库).

关于如何映射这个,保留我的代码结构的任何想法?

提前致谢.

collections nhibernate nhibernate-mapping nhibernate-collections

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

如何从实体类型中查找NHibernate实体的表映射?

一旦我在NHibernate中映射了我的域,我怎样才能在我的代码中的其他地方反向查找这些映射?

例:

由于Pony某种原因,该实体被映射到名为"AAZF1203"的表.(愚蠢的遗留数据库表名!)我想只使用typeof(Pony)因为我必须在其他地方编写查询来从NH映射中找出该表名.

我怎样才能通过以下测试?

private const string LegacyPonyTableName = "AAZF1203";

[Test]
public void MakeSureThatThePonyEntityIsMappedToCorrectTable()
{
    string ponyTable = GetNHibernateTableMappingFor(typeof(Pony));
    Assert.AreEqual(LegacyPonyTableName, ponyTable);
}
Run Code Online (Sandbox Code Playgroud)

换句话说,GetNHibernateTableMappingFor(Type t)需要看起来像什么?

c# nhibernate nhibernate-mapping

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

手动设置ID

我有一个Users表,其中"ID"字段是GUID字段.

使用ASPNET我正在创建一个用户帐户并获取GUID.我正在尝试使用该GUID作为主ID在我的表中创建关联记录.

我遇到的问题是,当我手动设置Users.ID时,NHibernate尝试进行更新,而不是插入.我用NHibernate Profiler看到这个,然后用"意外行数:0;预期:1"进行轰炸.

用户的用户界面用户看起来像:

public class UsersMap : ClassMap<Users>
{
    public UsersMap()
    {
        Id(x => x.ID, "ID"); //GUID

        Map(x => x.Name, "Name"); //string
        Map(x => x.PhoneNumber, "PhoneNumber"); //string
        Map(x => x.FaxNumber, "FaxNumber"); //string
        Map(x => x.EmailAddress, "EmailAddress"); //string

        HasMany<UsersAddressBook>(x => x.usersAddressBook).KeyColumn("ID");
    }
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?提前致谢.

nhibernate-mapping fluent-nhibernate

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

NHibernate MappingException:无法编译映射文档

在我的开发Web应用程序上,NHibernate正在花哨.当我预编译和部署站点时,我在创建SessionFactory时得到MappingException.

以下是跟踪中的一些信息:

MsSql2008Dialect 0.91570185596214 0.292365 NHibernate.Cfg.Configuration 2010-07-15 09:21:01,390 [7] ERROR NHibernate.Cfg.Configuration [(null)] - 无法编译映射文档:Kctc.BusinessLayer.Mappings.StoredWill.hbm. XML NHibernate.MappingException:无法编译映射文档:Kctc.BusinessLayer.Mappings.StoredWill.hbm.xml ---> System.InvalidOperationException:无法生成临时类(结果= 1).错误CS2001:找不到源文件'C:\ WINDOWS\TEMP\shp2uoc8.0.cs'错误CS2008:未指定输入 无法编译映射文档:Kctc.BusinessLayer.Mappings.StoredWill.hbm.xml ---> System.InvalidOperationException:无法生成临时类(result = 1).错误CS2001:找不到源文件'C:\ WINDOWS\TEMP\shp2uoc8.0.cs'错误CS2008:未指定输入 无法编译映射文档:Kctc.BusinessLayer.Mappings.StoredWill.hbm.xml ---> System.InvalidOperationException:无法生成临时类(result = 1).错误CS2001:找不到源文件'C:\ WINDOWS\TEMP\shp2uoc8.0.cs'错误CS2008:未指定输入

System.Xml.Serialization.Compiler.Compile(Assembly parent,String ns,XmlSerializerCompilerParameters xmlParameters,Evidence evidence)at System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping [] xmlMappings,Type [] types,String defaultNamespace,Evidence evidence, System.Xml.Serialization.XmlSerializer.GenerateTempAssembly的System.Xml.Serialization.TempAssembly..ctor(XmlMapping [] xmlMappings,Type []类型,字符串defaultNamespace,字符串位置,证据证据)中的XmlSerializerCompilerParameters参数,程序集程序集,Hashtable程序集) (XmlMapping xmlMapping,Type type,String defaultNamespace)位于System.Xml.Serialization.XmlSerializer..ctor(Type type)的System.Xml.Serialization.XmlSerializer..ctor(Type type,String defaultNamespace),位于NHibernate.Cfg.XmlHbmBinding.活页夹.在NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.Bind(XmlNode节点)处反序列化[T](XmlNode节点)NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc)---内部异常堆栈跟踪结束--- 2.20609881982207 1.290397未处理的执行错误无法编译映射文档:位于NHibernate.Cfg.Configuration的NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc)中的NHibernate.Cfg.Configuration.LogAndThrow(异常异常)中的Kctc.BusinessLayer.Mappings.StoredWill.hbm.xml.位于NHibernate.Cfg.Configuration.AddXmlReader(XmlReader hbmReader,String name)的NHibernate.Cfg.Configuration.AddDocumentThroughQueue(NamedXmlDocument文档)中的ProcessMappingsQueue()位于NHibernate.Cfg.Configuration.AddInputStream(Stream xmlInputStream,字符串名称)NHibernate.Cfg.Configuration.AddResource(字符串路径,汇编程序集)位于C:\ Kctc\Trunk\Kctc中的Kctc.BusinessLayer.NHibernateSessionFactory.get_SessionFactory()的NHibernate.Cfg.Configuration.AddAssembly(程序集程序集). BusinessLayer\NHibernateSessionFactory.cs:第26行
在C:\ Kctc\Trunk\Kctc.BusinessLayer\NHibernateSessionFactory.cs中的Kctc.BusinessLayer.NHibernateSessionFactory.OpenSession():
位于System.Web.UI.WebControls.Button的Developers_Test.ListSquirps(Object sender,EventArgs e)的第39行. System.Web上System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)中的System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)上的OnClick(EventArgs e). System.Web.UI.Page.ProcessRequestMain的System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
中的UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl,String eventArgument)(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)2.20665643259129 …

deployment nhibernate exception nhibernate-mapping

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

为什么NHibernate会在ISession.Refresh期间抛出"GenericADOException:无法初始化集合"异常?

我一直在经历一种奇怪的行为(至少对我而言)ISession.Refresh().

我有一个带有延迟加载的子集合的实体,以及一个访问此集合的只读属性,它们都包含在二级缓存中.ISession.Refresh()在将事务提交到DB后,我在长会话中使用以获取最新数据,并获得以下错误:

NHibernate.Exceptions.GenericADOException : could not initialize a collection: [Test.NUnit.DBTest.TestModel.ParentTestEntity.Children#d4251363-cf88-4684-b65a-9f330107afcf][SQL: SELECT children0_.ParentTestEntity_id as ParentTe4_1_, children0_.Id as Id1_, children0_.Id as Id42_0_, children0_.RowVersion as RowVersion42_0_, children0_.Parent_id as Parent3_42_0_ FROM "ChildTestEntity" children0_ WHERE children0_.ParentTestEntity_id=?]
  ----> System.NullReferenceException : Object reference not set to an instance of an object.
    at NHibernate.Loader.Loader.LoadCollection(ISessionImplementor session, Object id, IType type)
    at NHibernate.Loader.Collection.CollectionLoader.Initialize(Object id, ISessionImplementor session)
    at NHibernate.Persister.Collection.AbstractCollectionPersister.Initialize(Object key, ISessionImplementor session)
    at NHibernate.Event.Default.DefaultInitializeCollectionEventListener.OnInitializeCollection(InitializeCollectionEvent event)
    at NHibernate.Impl.SessionImpl.InitializeCollection(IPersistentCollection collection, Boolean writing)
    at NHibernate.Collection.AbstractPersistentCollection.Initialize(Boolean writing)
    at NHibernate.Collection.AbstractPersistentCollection.ReadSize()
    at NHibernate.Collection.PersistentBag.get_Count() …
Run Code Online (Sandbox Code Playgroud)

nhibernate lazy-loading nhibernate-mapping

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

NHibernate错误消息:此SqlParameterCollection的索引3无效,Count = 3

我有一个这样的测试数据库设计: 在此输入图像描述

以下是伪代码:

//BhillHeader
public class BillHeader
{
    public BillHeader()
    {
        BillDetails = new List<BillDetail>();
    }
    public virtual int BillNo { get; set; }
    public virtual IList<BillDetail> BillDetails { get; set; }
    public virtual decimal Amount { get; set; }

    public virtual void AddDetail(BillDetail billdet)
    {
        BillDetails.Add(billdet);
    }
}  

//BillHeader Map
public class BillHeaderMap : ClassMap<BillHeader>
{

    public BillHeaderMap()
    {
        Table("BillHeader");
        LazyLoad();
        Id(x => x.BillNo).GeneratedBy.Identity().Column("BillNo");
        Map(x => x.Amount).Column("Amount").Not.Nullable();
        HasMany(x => x.BillDetails).KeyColumn("BillNo").Cascade.All().Inverse();
    }
}  

//BillDetail
public class BillDetail
{
    public BillDetail() { …
Run Code Online (Sandbox Code Playgroud)

nhibernate nhibernate-mapping fluent-nhibernate

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

FluentNHibernate或端口到NHibernate的代码映射

我有几个项目使用NH和FNH生成映射(一些Fluent一些Automapped).我仍然需要一些bug和缺少的功能,但似乎FNH可能因为集成到NHibernate中的代码映射而死亡.

问题:有助于FNH或将映射迁移到代码映射或confORM并修复问题/实现功能吗?

nhibernate nhibernate-mapping fluent-nhibernate nhibernate-mapping-by-code fluent-nhibernate-mapping

7
推荐指数
2
解决办法
2351
查看次数

流利的NHibernate - 不必要的更新

在这两者之间单向许多一对多的关系,RegistrationItem,其中RegistrationISet<Item> ItemsPurchasedItem没有回头参考注册(它不是探索对象图的有效方式),当我看着SQL生成,我见

INSERT INTO Registrations_Items (RegistrationId, ItemId) VALUES (@p0, @p1);@p0 = 1 [Type: Int32 (0)], @p1 = 1 [Type: Int32 (0)]
UPDATE Items SET Price = @p0, Name = @p1, [...], ListIndex = @p5, EventId = @p6 WHERE ItemId = @p7
Run Code Online (Sandbox Code Playgroud)

传递给更新的参数是正确的,但没有关于Item的更改,因此不需要更新.

映射是通过使用此覆盖自动执行Registration而不是覆盖Item.DB Schema看起来完全正确.我删除了所有约定并再次测试,并且行为仍然存在,因此我的映射约定并不是这样做的.

mapping.HasManyToMany(e => e.ItemsPurchased).AsSet().Cascade.All().Not.Inverse();

为什么NHibernate会打这个UPDATE电话,我该怎么做才能阻止它呢?它并没有真正伤害任何东西,但它表明我做错了什么,所以我想弄明白什么.

编辑: 根据下面的评论,我创建了一个单元测试,它创建了一个Event(Item必须属于一个Event),Items向它添加两个,从会话中清除第一个并刷新会话,然后通过其ID获取第一个返回.

我在下面的SELECT项目行中注意到一些奇怪的东西(从下到下)

INSERT INTO Events (blah blah …
Run Code Online (Sandbox Code Playgroud)

nhibernate nhibernate-mapping fluent-nhibernate fluent-nhibernate-mapping

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