Я пытаюсь создать систему обмена сообщениями между пользователями и организациями, то есть пользователь может отправлять и получать сообщения от пользователей или организаций.
Итак, для поддержки этой системы я начал с интерфейса:
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 универсальными типами. Кому, откуда и объект
Затем я создал свой класс сообщений
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 отдельных класса для пользователей-пользователей, пользователей-организаций, организаций-пользователей и организаций-организаций. Я надеялся, что Nhibernate возьмет guid из таблицы и автоматически попытается извлечь объект на основе указанного типа.
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: ассоциация из таблицы PassedItems не указывает ссылочный объект
Итак, будет ли этот подход вообще работать? Что я делаю неправильно? Спасибо!