ОК, независимо от того, как я определяю эти сопоставления, мое сопоставление "многие-ко-многим" не хочет работать с каскадной вставкой. Я пробовал различную комбинацию Cascade()
с Reverse()
и удалял все ненужные свойства, чтобы понять, не связано ли это с тем, что это не работает, но нет блокировки.
Это действительно простой материал: у меня есть Message
(например, электронная почта), который отправляется от пользователя (я вызывал объект BasicUser
) нескольким пользователям (через свойство To
). User
и Message
в терминах получателей имеют отношение "многие ко многим", но FromUser
имеет один-ко-многим. FromUser отлично работает, и он обновляется хорошо, но моя проблема связана со многими-ко-многим. Я даже удалил FromUser
и отношения, чтобы проверить, была ли эта проблема, но не помогло.
Итак, вот дизайн таблицы (Удалил связь от FromUser
до BasicUser
для простоты)
А вот отображения:
public class MessageMap : ClassMap<Message>
{
public MessageMap()
{
Id(x => x.Id).Column("MessageId");
Map(x => x.Subject);
Map(x => x.SentAt);
Map(x => x.Body);
References(x => x.From).Column("FromUser");
HasManyToMany(x => x.To).Table("BasicUserMessage").ChildKeyColumn("BasicUserId")
.ParentKeyColumn("MessageId").Cascade().All();
}
}
public class BasicUserMap : ClassMap<BasicUser>
{
public BasicUserMap()
{
Id(x => x.Id).Column("BasicUserId");
Map(x => x.DisplayName);
Map(x => x.Username);
HasManyToMany(x => x.Messages).Table("BasicUserMessage").ChildKeyColumn("MessageId")
.ParentKeyColumn("BasicUserId").Inverse();
}
}
И я вызываю это, и он не работает (таблица BasicUserMessage
не заполняется):
(Примечание. Пользователи с идентификаторами 1, 2 и 3 действительно существуют - я также попытался получить их из базы данных, а затем добавить в список все еще не работал)
ISessionFactory factory = GetSessionFactory();
ISession session = factory.OpenSession();
Message m = new Message()
{
Body = "Please note 2",
Subject = "Secret 2",
From = new BasicUser(){Id = 2},
SentAt = DateTime.Now,
};
m.To.Add(new BasicUser(){Id = 1});
m.To.Add(new BasicUser(){Id=3});
session.SaveOrUpdate(m);
session.Close();