nhibernate отображает много строк в один объект - PullRequest
1 голос
/ 26 мая 2011

У меня довольно сложная проблема с отображением.

РЕДАКТИРОВАТЬ: переформулированное описание

по историческим причинам тексты не сохраняются в столбце как текст, а сохраняются в таблицах. У меня есть несколько таблиц со следующей структурой:

TABLE SomeEntityTexts
(
  id serial NOT NULL,
  key character varying(10),      // \
  linenumber integer,             // / unique constraint
  type smallint,
  length smallint,                // actual length of content string
  content character varying(80),
  PRIMARY KEY (id)
)

текст сохраняется в виде строк произвольной длины, различающихся для каждой сущности, а иногда даже для разных типов текста в одной таблице. я хотел бы сопоставить их с классами, которые обрабатывают эти причуды внутри и в отображениях.

мое решение до сих пор:

скрытая коллекция и фиктивный объект, который должен быть доступен только для чтения. Для загрузки всегда есть действительные Text-объекты, потому что при сохранении внутренней коллекции они создаются.

internal class Textline
{
    public virtual int Id { get; set; }

    public virtual TextType Type { get; set; }   // Enum

    public virtual int Linenumber { get; set; }
    public virtual string Text { get; set; }
}

public class Textmodule
{
    public virtual int Id { get; set; }

    public virtual string Key { get; set; }      // Unique
    public virtual TextType Type { get; set; }   // Enum

    protected internal virtual IList<Textline> Textlines { get; set; }
    public virtual string Text
    {
        get { Textlines.select(t => t.Text).Aggregate(/* ...*/); }
        set { /* split text to lines with max 80 chars and feed to Textlines*/}
    }
}

public TextmoduleMap()
{
    Table("textmodules");
    ReadOnly();    // problem: shouldnt insert and update at all, but does insert
    Where("linenumber = 1");  // starts with 1

    // doesnt matter because it shouldnt be saved
    Id(text => text.Id, "id").GeneratedBy.Custom<SimpleGenerator>();

    Map(text => text.Key);
    HasMany(text => text.Textzeilen)
        .Table("textmodules")
        .PropertyRef("Key")
        .KeyColumn("key")
        .Component(c =>
        {
            c.Map(line => line.Text)
                .Columns.Add("content", "length")
                .CustomType<StringWithLengthUserType>();
            c.Map(line => line.Linenumber, "linenumber");
        })
        .Cascade.AllDeleteOrphan()
        .Not.LazyLoad();
        ;
}

Моя проблема в том, что Readonly не мешает nhibernate вставить его при сохранении. Могу ли я что-нибудь сделать, чтобы это заработало, или у кого-то есть идея для более разумного доменного объекта?

Edit2: я возился с SQLInsert("SELECT 1");, но я получаю исключение "неожиданный счетчик строк -1, ожидаю 1"

спасибо за ваше время

1 Ответ

0 голосов
/ 12 октября 2011

я нашел довольно уродливый способ, который, вероятно, не очень переносим

public TextmoduleMap()
{
    ...
    ReadOnly();
    SqlInsert("DROP TABLE IF EXISTS temp; CREATE TEMP TABLE temp(id int); INSERT INTO temp (id) VALUES (1);");
    SqlDelete("DROP TABLE IF EXISTS temp; CREATE TEMP TABLE temp(id int); INSERT INTO temp (id) VALUES (1);");

    ...
}

Лучшие способы еще приветствуются

...