Исправление WrongClassException при попытке реализовать шаблон страtagsи (распознавание по собственному идентификатору)

Я пытаюсь реализовать шаблон страtagsи с Fluent Nhibernate, вдохновленный этим сообщением в блоге

public abstract class Strategy { protected Strategy() { } protected Strategy(Guid id) { this.Id = id; } public virtual Guid Id { get; set; } public abstract void SomeMethod(); } public class MyStrategy : Strategy { public MyStrategy() : base(new Guid("F1CF041B ...")) { } public override void SomeMethod() { } } public class StrategyMap : ClassMap { public StrategyMap() { this.Id(x => x.Id).GeneratedBy.Assigned(); this.DiscriminateSubClassesOnColumn("Id"); } } public class MyStrategyMap : SubclassMap { public MyStrategyMap() { this.DiscriminatorValue("F1CF041B ..."); } } 

Но когда я запускаю следующий тест (где this.Session из базы данных в памяти):

 [TestMethod] public void CanGetMyStrategy() { // Arrange using (var transaction = this.Session.BeginTransaction()) { this.Session.Save(new MyStrategy()); transaction.Commit(); this.Session.Clear(); } // Act var strategies = this.Session.Query(); // Assert Assert.IsNotNull(strategies.FirstOrDefault()); } 

Вызывается следующее исключение:

 NHibernate.WrongClassException: Object with id: f1cf041b ... was not of the specified subclass: Namespace.Strategy (Discriminator was: 'f1cf041b ...') 

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


Неудачное решение

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


Почему руководство?

Причиной этого является то, что новая Strategy s будет создана через архитектуру плагина (обеспечивающая реализацию Strategy и SubclassMap которые считываются при загрузке приложения), и поэтому мне нужно использовать Guid s, поэтому нет конфликтов с идентификаторами.

Кажется, что в classе Strategy вы используете Id типа Guid но в string classа mapper вместо Guid используется.

Я изменил class карты, как описано ниже, и исключение перестало появляться

 public class MyStrategyMap : SubclassMap { public MyStrategyMap() { this.DiscriminatorValue(new Guid("F1CF041B ...")); } }