Nhibernate - Как создавать доменные объекты и сопоставления с CompositeId - PullRequest
2 голосов
/ 18 августа 2010

сначала я действительно новичок в ORM, nhibernate и FHN. Я смотрю на это в течение нескольких дней. У меня есть база данных с 4 таблицами:

alt text

поэтому я сначала попытался заставить работать Auswahl и RefAuswahlFilter.

вот мои доменные объекты: пожалуйста, дайте мне знать, когда я смогу сделать это лучше

[Serializable]
public class Auswahl
{
    public Auswahl()
    {
        this.RefFilters = new List<RefAuswahlFilter>();
    }

    public virtual IList<RefAuswahlFilter> RefFilters { get; set; }

    //...rest of the Properties

[Serializable]
public class RefAuswahlFilter
{
    public virtual Auswahl Auswahl { get; set; }
    public virtual long Filterrank { get; set; }
    public virtual string Filter { get; set; }

вот мои отображения:

public class AuswahlMap : ClassMap<Auswahl>
{
    public AuswahlMap()
    {
        Table("AUSWAHL");

        Id(x => x.Id)
            .GeneratedBy.Sequence("SEQ_AUSWAHL");

        Map(x => x.Programm);
        Map(x => x.Variante);
        Map(x => x.Returnkey);
        Map(x => x.Beschreibung);

        HasMany<RefAuswahlFilter>(x => x.RefFilters);

    }
}

public class RefAuswahlFilterMap : ClassMap<RefAuswahlFilter>
{
    public RefAuswahlFilterMap()
    {
        Table("REFAUSWAHLFILTER");

        CompositeId()
            .KeyReference(x => x.Auswahl,"IDAUSWAHL")
            .KeyProperty(x => x.Filterrank,"FILTERANK");

        Map(x => x.Filter);
    }
}

если я запускаю свое приложение, я получаю список со всеми строками Auswahl.

var l = session.CreateCriteria(typeof(Auswahl)).List<Auswahl>();

но когда я смотрю в элемент, чтобы получить RefFilters, отладчик показывает следующую ошибку:

innerException {"ORA-00904: \" REFFILTERS0 \ ". \" AUSWAHL_ID \ ": ungültiger Bezeichner \ n"}

не удалось инициализировать коллекцию: [ORMTest.DomainModel.Auswahl.RefFilters # 1097] [SQL: SELECT reffilters0_.Auswahl_id в Auswahl4_1_, reffilters0_.IDAUSWAHL как IDAUSWAHL1_, reffilters0_.FILTERANK как FILTERANK1_, reffilters0_.IDAUSWAHL как IDAUSWAHL3_0_, reffilters0_. FILTERANK as FILTERANK3_0_, reffilters0_.Filter as Filter3_0_ FROM REFAUSWAHLFILTER reffilters0_ ГДЕ reffilters0_.Auswahl_id =?]

так что я думаю, что что-то в моем отображении неправильно, но я действительно не понимаю.

ТНХ.

1 Ответ

2 голосов
/ 25 августа 2010

хорошо, я был частично успешным.чтение из БД работает сейчас.

public AuswahlMap()
    {
        Table("AUSWAHL");

        Id(x => x.Id,"ID")
            .GeneratedBy.Sequence("SEQ_AUSWAHL");

        Map(x => x.Programm);
        Map(x => x.Variante);
        Map(x => x.Returnkey).Not.Nullable();
        Map(x => x.Beschreibung);

        HasMany(x => x.RefFilters)
            .Inverse()
            .Cascade.All();    
    }

public RefAuswahlFilterMap()
    {
        Table("REFAUSWAHLFILTER");

        CompositeId()
            .KeyReference(x => x.Auswahl,"IDAUSWAHL")
            .KeyProperty(x => x.Filterrank);

        Map(x => x.Filter);

        References(x => x.Auswahl)
            .Column("IDAUSWAHL")
            .Not.Nullable();
    }

Сохранение в БД до сих пор работает с пустым списком (RefFilters), поэтому я должен рассмотреть это сейчас.это из моего журнала.я действительно не знаю, откуда взялась "NHibernate.Type.Int64Type - привязка '1' к параметру: 3 14: 31: 18.585 [9] DEBUG", но это исключение, которое я пока получаю.

14:31: 18.397 [9] DEBUG NHibernate.Persister.Entity.AbstractEntityPersister - Вставка сущности: [ORMTest.DomainModel.RefAuswahlFilter # ORMTest.DomainModel.RefAuswahlFilter] 14: 31: 18.413.DBDBB; DEBDBD;open IDbCommands: 1 14: 31: 18.413 [9] DEBUG NHibernate.AdoNet.AbstractBatcher - Создание объекта IDbCommand для SqlString: INSERT INTO REFAUSWAHLFILTER (Filter, IDAUSWAHL, Filterrank) ЗНАЧЕНИЯ (?,?,? 13) 14: 31: 31: 31: 31: 31: 31: 31: 31[9] DEBUG NHibernate.Persister.Entity.AbstractEntityPersister - Обезвоживающая сущность: [ORMTest.DomainModel.RefAuswahlFilter # ORMTest.DomainModel.RefAuswahlFilter] 14: 31: 18.413 [9] Параметр DEBUG-связывания: Тип: Нибертинг.0 14: 31: 18.413 [9] DEBUG NHibernate.Typ - DEBUG NHibernate.Type.Int64Type - привязка '1446' к параметру: 1 14: 31: 18.413 [9]e.Int64Type - привязка '1446' к параметру: 2 14: 31: 18.413 [9] DEBUG NHibernate.Type.Int64Type - привязка '1' к параметру: 3 14: 31: 18.585 [9] DEBUG NHibernate.AdoNet.AbstractBatcher -Закрытая команда IDbCommand, открытая команда IDbCommands: 0 14: 31: 18.647 [9] DEBUG NHibernate.AdoNet.ConnectionManager - регистрация завершения сброса

РЕДАКТИРОВАТЬ: если я изменяю свое отображение на

public RefAuswahlFilterMap()
    {
        Table("REFAUSWAHLFILTER");

        CompositeId()
            .KeyReference(x => x.Auswahl,"IDAUSWAHL")
            .KeyProperty(x => x.Filterrank);

        Map(x => x.Filter);
    }

сохранение работкак и ожидалось.тем не менее, NHibernate Profiler показывает некоторые предупреждения, и мой выбор для RefAuswahlFilter выглядит не так хорошо:)

SELECT reffilters0_.IDAUSWAHL  as IDAUSWAHL1_,
       reffilters0_.Filterrank as Filterrank1_,
       reffilters0_.IDAUSWAHL  as IDAUSWAHL3_0_,
       reffilters0_.Filterrank as Filterrank3_0_,
       reffilters0_.Filter     as Filter3_0_
FROM   REFAUSWAHLFILTER reffilters0_
WHERE  reffilters0_.IDAUSWAHL = 1 /* :p0 */
...