Я пытаюсь создать систему обмена сообщениями между пользователями и организациями, то есть пользователь может отправлять и получать сообщения от пользователей или организаций.
Итак, для поддержки этой системы я начал с интерфейса:
public interface IPassableObject<F, T, O>
where F : DomainObject
where T : DomainObject
{
Guid PassedItemId { get; set; }
O Item { get; set; }
F From { get; set; }
T To { get; set; }
DateTime Created { get; set; }
}
Идея состоит в том, что позже я хотел бы иметь возможность передавать больше, чем просто сообщения - как сериализованные объекты. Итак, у нас есть класс с 3 типами Generic. Кому, От и объекту
Тогда я создал свой класс сообщений
public class Message<T, F> : DomainObject, IPassableObject<T, F, string>
where F : DomainObject
where T : DomainObject
{
public Message()
{
Created = DateTime.Now;
}
#region IPassableObject<T,F> Members
public virtual Guid PassedItemId { get; set; }
public virtual string Item { get; set; }
public virtual T From { get; set; }
public virtual F To { get; set; }
public virtual DateTime Created { get; set; }
#endregion
}
Затем я сделал свой стол для поддержки пропущенных предметов:
CREATE TABLE dbo.PassedItems
(
PassedItemId uniqueidentifier NOT NULL,
FromId uniqueidentifier NOT NULL,
ToId uniqueidentifier NOT NULL,
SerializedObject varchar(max) NOT NULL,
Created datetime DEFAULT(GETEDATE()) NOT NULL,
CONSTRAINT PK_PassedItems PRIMARY KEY CLUSTERED (PassedItemId)
)
Идентификаторы для моих пользователей и организаций являются направляющими. Теперь у меня есть свободное отображение для сообщений пользователя - пользователя. Я думаю, что мне нужно будет создать только 4 сопоставления, а не поддерживать 4 отдельных класса для user-user, user-org, org-user и org-org. Я надеялся, что Nhibernate возьмет указатель в таблицу и автоматически попытается добавить объект в соответствии с указанным типом.
public class UserToUserMessageMap : ClassMap<Message<UserProfile, UserProfile>>
{
public UserToUserMessageMap()
{
WithTable("PassedItems");
Id(x => x.PassedItemId, "PassedItemId").GeneratedBy.Guid();
Map(x => x.Item, "SerializedObject");
Map(x => x.Created);
References(x => x.From, "FromId");
References(x => x.To, "ToId");
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что при запуске приложения возникает ошибка во время выполнения:
NHibernate.MappingException: An
ассоциация из таблицы PassedItems
не указывает ссылочный объект
Так, этот подход вообще сработает? Что я делаю неправильно? Спасибо!