Я прочитал пост о fetch = join - http://nhforge.org/blogs/nhibernate/archive/2009/04/09/nhibernate-mapping-lt-many-to-one-gt.aspx (ser4ik.livejournal.com/2505.html)
Итак, у меня есть вопрос, например, у меня есть класс
<class name="AttributesInf" table="attr_inf">
<id name="Id">
<generator class="identity"/>
</id>
<property name="Name" />
<property name="Desc"/>
</class>
и
<class name="AttributeValue" table="attr_val">
<id name="Id">
<generator class="identity"/>
</id>
<property name="Value" />
<many-to-one name="AttrName" column="attrId"/>
</class>
Если я использую это отображение без set fetch = "join", я получаю sql:
Select av.Id, av.Value, av.attrId From attr_val av where av.Id=...()
и после этого отдельные SQL-запросы, такие как:
Select * From attr_inf where Id = av.attrId
Итак, мой результат:
class AttrinuteInf
{
int Id;
string Name;
string Desc;
}
class AttributeValue
{
int Id;
string Value;
AttributeInf AttrName;
}
Если я установлю fetch = "join", то получу один запрос:
Select u.Id, u.UserName, u.BlogId, b.Id, b.BlogName, b.BlogAuthor, b.BlogMsg
from Users u
Left outer join Blogs b
On u.BlogId=b.Id
Where u.Id = ...
Так что я ожидаю получить один класс:
class AttributeValue
{
int Id;
string Value;
string Name;
string Desc;
}
Но у меня тот же результат, как если бы я не установил fetch для "join".
Это все в порядке?
Есть ли способ получить свойства из класса, сопоставленного как <many-to-one>
напрямую?
(не как AttrName.Name, а просто Name)
Пояснение:
Часть отображенного выше набора не показывает мою реальную проблему.
Я хочу отобразить некоторую сущность как IDictionary<string,AttributeValue>
.
Я отображаю это как
<map name="Attributes" table="attr_val" lazy="true" cascade="all-delete-orphan" inverse="true">
<key column="item_id"></key>
<index column="name"></index> //I don't have that item in class AttributeValue, that is why I try to get it from other table
<one-to-many class="AttributeValue"/>
</map>