Fluent NHibernate和具有单个列名的复合ID
我已经在FNH谷歌集团发布了这篇文章,但独家报道如下: 我在遗留数据库中有一个表,它有一个复合ID PK是隐含的,因为表实际上没有定义PK,但是 自然PK是WORKORDERID和IMAGEPATH的组合 栏目: 我定义了这个类映射:Fluent NHibernate和具有单个列名的复合ID,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我已经在FNH谷歌集团发布了这篇文章,但独家报道如下: 我在遗留数据库中有一个表,它有一个复合ID PK是隐含的,因为表实际上没有定义PK,但是 自然PK是WORKORDERID和IMAGEPATH的组合 栏目: 我定义了这个类映射: /// <summary> /// NHibernate mapping for workorder attachments /// </summary> public class AttachmentMap : C
/// <summary>
/// NHibernate mapping for workorder attachments
/// </summary>
public class AttachmentMap : ClassMap<Attachment>
{
public AttachmentMap()
{
SchemaIs(Resources.DatabaseSchema);
WithTable(ObjectNames.TableWorkorderAttachment);
UseCompositeId()
.WithKeyProperty(x => x.ParentId, "WORKORDERID")
.WithKeyProperty(x => x.FileLocation, "IMAGEPATH");
Map(x => x.AttachedByUser, "ATTACHEDBY").WithLengthOf(100).Nullable();
Map(x => x.AttachedOn, "DATETIMEATTACHED").Nullable();
Map(x => x.Comments).Nullable().WithLengthOf(256);
References(x => x.ParentWorkorder).FetchType.Join();
}
}
现在我知道我应该在
引用行的类映射。排除了它,我得到了
预期错误:
NHibernate: INSERT INTO azteca.WorkOrderImg (ATTACHEDBY,
DATETIMEATTACHED, Comments, ParentWorkorder_id, WORKORDERID,
IMAGEPATH) VALUES (@p0, @p1, @p2, @p3, @p4, @p5);@p0 = 'SYSTEM', @p1 = 3/15/2009 12:00:00 AM, @p2 = 'Some comment', @p3 = NULL, @p4 = NULL, @p5 = 'some ile\location'
System.Data.SqlClient.SqlException: Invalid column name 'ParentWorkorder_id'.
然而,当我把它包括进来时,我会很流利地尝试添加
将WORKORDERID列添加到查询中两次:
System.IndexOutOfRangeException: Invalid index 5 for this SqlParameterCollection with Count=5.
我一直在尝试我能想到的每一种组合,但都没有用。我是
使用以下代码测试映射:
[Test]
public void Can_persist_an_attachment()
{
var sf = ObjectFactory.GetNamedInstance<ISessionFactory> (ObjectMother.Datasource);
using (ISession session = sf.OpenSession())
{
new PersistenceSpecification<Attachment>(session)
.CheckProperty(x => x.AttachedByUser, "SYSTEM")
.CheckProperty(x => x.AttachedOn, new DateTime(2009, 3, 15))
.CheckProperty(x => x.Comments, "Some comment")
.CheckProperty(x => x.FileLocation, "some\file\\location")
.VerifyTheMappings();
}
}
[测试]
public void可以保存\u附件()
{
var sf=ObjectFactory.GetNamedInstance(ObjectMother.Datasource);
使用(ISession session=sf.OpenSession())
{
新PersistenceSpecification(会话)
.CheckProperty(x=>x.AttachedByUser,“系统”)
.CheckProperty(x=>x.AttachedOn,新日期时间(2009,3,15))
.CheckProperty(x=>x.Comments,“一些注释”)
.CheckProperty(x=>x.FileLocation,“some\file\\location”)
.验证应用程序();
}
}
感谢您的帮助。解决了这个问题。您不需要为父对象添加引用属性。请注意,调整后的映射中缺少多对一:
public AttachmentMap()
{
SchemaIs(Resources.CityworksDatabaseSchema);
WithTable(ObjectNames.TableWorkorderAttachment);
UseCompositeId()
.WithKeyReference(x => x.ParentWorkorder, "WORKORDERID")
.WithKeyProperty(x => x.FileLocation, "IMAGEPATH");
Map(x => x.AttachedByUser, "ATTACHEDBY").WithLengthOf(100).Nullable();
Map(x => x.AttachedOn, "DATETIMEATTACHED").Nullable();
Map(x => x.Comments).Nullable().WithLengthOf(256);
//References(x => x.ParentWorkorder, "WORKORDERID").FetchType.Join();
}
这将生成以下HBM映射文件。修复方法是让复合id有一个键多对一行指向父类。现在我可以坚持我的附件类
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="">
<class name="Woolpert.Cityworks.Core.Entities.Azteca.Attachment, Woolpert.Cityworks.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="WorkOrderImg" xmlns="urn:nhibernate-mapping-2.2" schema="azteca">
<composite-id>
<key-many-to-one class="Woolpert.Cityworks.Core.Entities.Azteca.Workorder, Woolpert.Cityworks.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="ParentWorkorder" column="WORKORDERID" />
<key-property type="String" name="FileLocation" column="IMAGEPATH" />
</composite-id>
<property name="AttachedByUser" type="String">
<column name="ATTACHEDBY" length="100" not-null="false" />
</property>
<property name="AttachedOn" type="System.Nullable`1[[System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]">
<column name="DATETIMEATTACHED" not-null="false" />
</property>
<property name="Comments" type="String">
<column name="Comments" length="256" not-null="false" />
</property>
</class>
</hibernate-mapping>
public AttachmentMap()
{
SchemaIs(Resources.CityworksDatabaseSchema);
WithTable(ObjectNames.TableWorkorderAttachment);
UseCompositeId()
.WithKeyReference(x => x.ParentWorkorder, "WORKORDERID")
.WithKeyProperty(x => x.FileLocation, "IMAGEPATH");
Map(x => x.AttachedByUser, "ATTACHEDBY").WithLengthOf(100).Nullable();
Map(x => x.AttachedOn, "DATETIMEATTACHED").Nullable();
Map(x => x.Comments).Nullable().WithLengthOf(256);
//References(x => x.ParentWorkorder, "WORKORDERID").FetchType.Join();
}
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="">
<class name="Woolpert.Cityworks.Core.Entities.Azteca.Attachment, Woolpert.Cityworks.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="WorkOrderImg" xmlns="urn:nhibernate-mapping-2.2" schema="azteca">
<composite-id>
<key-many-to-one class="Woolpert.Cityworks.Core.Entities.Azteca.Workorder, Woolpert.Cityworks.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="ParentWorkorder" column="WORKORDERID" />
<key-property type="String" name="FileLocation" column="IMAGEPATH" />
</composite-id>
<property name="AttachedByUser" type="String">
<column name="ATTACHEDBY" length="100" not-null="false" />
</property>
<property name="AttachedOn" type="System.Nullable`1[[System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]">
<column name="DATETIMEATTACHED" not-null="false" />
</property>
<property name="Comments" type="String">
<column name="Comments" length="256" not-null="false" />
</property>
</class>
</hibernate-mapping>