У меня довольно сложная проблема с отображением.
РЕДАКТИРОВАТЬ: переформулированное описание
по историческим причинам тексты не сохраняются в столбце как текст, а сохраняются в таблицах. У меня есть несколько таблиц со следующей структурой:
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"
спасибо за ваше время