NHibernate:复合键多对一映射:Can';t解析属性(外键组件)
我希望任何人都能帮忙。我必须针对第三方数据库进行开发,我被他们糟糕的设计卡住了。尽管如此,我还是想使用NHibernate,所以我必须跳出篮筐 简单地说,有一个“事件”表与“运输”表有一个关系。传输表有一个复合主键,由字段“ID”和“FK_EventID”组成,后者当然指回事件记录。每个事件都指向传输表中的一条不同记录,因此它实际上是一对一的关系。顺便说一句,这两个字段都是guid 为了解决这个问题,我创建了这些类(为了简单起见,省略了其他数据字段): 以及: 在映射文件中,我尝试这样做(请注意,我使用的是多对一):NHibernate:复合键多对一映射:Can';t解析属性(外键组件),nhibernate,mapping,composite-key,one-to-one,many-to-one,Nhibernate,Mapping,Composite Key,One To One,Many To One,我希望任何人都能帮忙。我必须针对第三方数据库进行开发,我被他们糟糕的设计卡住了。尽管如此,我还是想使用NHibernate,所以我必须跳出篮筐 简单地说,有一个“事件”表与“运输”表有一个关系。传输表有一个复合主键,由字段“ID”和“FK_EventID”组成,后者当然指回事件记录。每个事件都指向传输表中的一条不同记录,因此它实际上是一对一的关系。顺便说一句,这两个字段都是guid 为了解决这个问题,我创建了这些类(为了简单起见,省略了其他数据字段): 以及: 在映射文件中,我尝试这样做(请注意
以及:
当我尝试运行此操作时,会收到以下异常消息:
NHibernate.QueryException:无法解析属性:FK_TransportationID的:FcoLib.FcoEvent
我的第一个预感是字段名中可能有拼写错误,但这并不成立。所以现在我完全迷惑不解,不知道如何继续。非常感谢您的帮助。Thnx
更新 我想我找到了错误的根源。我还没有查看,因为我假设这是一个映射错误,但显然这是一个查询错误。在执行查询时会发生这种情况:
fcoEvents = session.CreateCriteria(typeof(FcoEvent))
.Add(Restrictions.Eq("ID", eventId))
.Add(Restrictions.Eq("FK_TransportationID", transportId))
.List<FcoEvent>();
fcoEvents=session.CreateCriteria(typeof(FcoEvent))
.Add(Restrictions.Eq(“ID”,eventId))
.Add(Restrictions.Eq(“FK_TransportationID”,transportId))
.List();
我将进一步研究这个问题,但显然我需要用另一种方式来质疑这个问题 我真傻。我被一些错误的、过时的代码分散了注意力。关键是能够使用事件的主键检索事件,包括相关的传输子级,这很简单。此外,还可以使用复合主键检索传输问题,这可以通过以下代码实现
public FcoTransportation GetTransportation(Guid transportId, Guid eventId)
{
FcoTransportation transport;
ISession session = Factory.OpenSession();
ITransaction tx = session.BeginTransaction();
try
{
transport = session.Get<FcoTransportation>(new FcoTransportation()
{
ID = transportId,
FK_EventID = eventId
});
公共FCotTransportation GetTransportation(Guid transportId,Guid eventId)
{
F交通运输;
ISession session=Factory.OpenSession();
ITransaction tx=会话.BeginTransaction();
尝试
{
transport=session.Get(新的FcoTransportation()
{
ID=传输ID,
FK_EventID=EventID
});
所以这真的不是问题。我只是被整个复合外键的东西弄糊涂了。我希望我没有浪费人们的时间
<class name="FcoLib.FcoEvent, FcoLib" table="FCO_Event">
<id name="ID" column="ID">
<generator class="guid" />
</id>
<many-to-one name="Transportation" not-found="ignore" cascade="save-update"
class="FcoLib.FcoTransportation, FcoLib">
<column name="FK_TransportationID" />
<column name="ID" />
</many-to-one>
<class name="FcoLib.FcoTransportation, FcoLib" table="FCO_Transportation">
<composite-id>
<key-property name="ID" />
<key-property name="FK_EventID" />
</composite-id>
fcoEvents = session.CreateCriteria(typeof(FcoEvent))
.Add(Restrictions.Eq("ID", eventId))
.Add(Restrictions.Eq("FK_TransportationID", transportId))
.List<FcoEvent>();
public FcoTransportation GetTransportation(Guid transportId, Guid eventId)
{
FcoTransportation transport;
ISession session = Factory.OpenSession();
ITransaction tx = session.BeginTransaction();
try
{
transport = session.Get<FcoTransportation>(new FcoTransportation()
{
ID = transportId,
FK_EventID = eventId
});