我遇到的问题(我认为)应该很简单,但找不到任何明确的信息。
在我有三个表的情况下,描述一个人可以拥有多个作业的域:
人 - 有PersonId,姓名
工作 - 有JobId,JobName
PersonJob - 有PersonId,JobId,YearsOfEmployment
注意:在我的对象模型中,我有代表每个表的实体。我有第三个实体代表人/工作关系,因为那里有有用的元数据(YearsOfEmployment),而不仅仅是一个简单的连接表。
所以,如果我知道PersonId和JobId,我是否有一种简单的方法可以使用会话并返回与这些ID相匹配的对象?
或者,换一种方式,因为我已经知道主键有一种脑死亡,简单的方法我可以将SQL“SELECT YearsOfEmployment from PersonJob WHERE PersonId = 1 AND JobId = 1”转换为:< / p>
var keys = new {PersonId=1, JobId=2};
PersonJob obj = Session.Get<PersonJob>(keys);
BTW:地图看起来像这样:
<class name="Person" table="dbo.Person" lazy="true">
<id name="PersonId">
<generator class="native"/>
</id>
<property name="Name"/>
</class>
<class name="Job" table="dbo.Job" lazy="true">
<id name="JobId">
<generator class="native"/>
</id>
<property name="JobName"/>
</class>
<class name="PersonJob" table="dbo.PersonJob" lazy="true">
<composite-id>
<key-property name="PersonId"></key-property>
<key-property name="JobId"></key-property>
</composite-id>
<property name="YearsOfEmployment"/>
</class>
答案 0 :(得分:8)
好吧,我回答了自己的问题。我认为发布你的问题几乎就像和某人说话一样。如果我要将PersonJob的复合id作为一个组件或类,即
<class name="PersonJob" table="dbo.PersonJob" lazy="true">
<composite-id name="PersonJobKey" class="PersonJobKey">
<key-property name="PersonId"></key-property>
<key-property name="JobId"></key-property>
</composite-id>
</class>
然后我可以这样做:
PersonJobKey key = new PersonJobKey() { PersonId = 1, JobId = 1 };
PersonJob obj = Session.Get<PersonJob>(key);
int yearsOfEmployment = obj.YearsOfEmployment;
冷却。希望这有助于其他任何人解决这个问题......
答案 1 :(得分:3)
感谢您发布上面的答案,我正在查看它已映射到的对象,其中复合键没有名称或类。当我尝试创建一个表示复合键的类时,它改变了对象在被其他代码使用时的行为方式。我也想写一些像;
Session.Get<SalesRepArea>(new { AreaCode = "ACode", RegionCode = "RCode"});
我发现nHibernate无法理解匿名对象,但我确实意识到我的复合键或类类型不需要名称。事实上,nHibernate Get方法之后是一个瞬态对象,因此它可以从数据库中获取它的等效对象(必须为什么必须覆盖C#类中的equals方法才能使复合键工作)。所以对于下面的地图
<class name="SalesRepArea">
<composite-id>
<key-property
name="AreaCode" column="AreaCode" type="String" length="12" />
<key-property
name="RegionCode" column="RegionCode" type="String" length="12" />
</composite-id>
我写了一些代码,省去了代表获取密钥的对象
SalesRepArea myArea = Session.Get<SalesRepArea>(
new SalesRepArea()
{
AreaCode = "ACode",
RegionCode = "RCode"
}
);
我不是说命名密钥方法不好,代码并不总是更好,只是为了表明Hibernate正在寻找密钥所在的对象来从数据库中获取特定对象。
如果我弄错了请告诉我,但我希望这会有所帮助,因为我对此有点麻烦。
谢谢,
标记