尝试实现策略模式时的WrongClassException(区分自己的Id)

我正在尝试使用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()); } 

抛出以下exception:

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

任何帮助调试此问题将不胜感激,因为我无法弄清楚为什么这不起作用。


不满意的解决方案

我可以通过不区分Id列来获得代码(因此创建另一个列来区分),但我发现这不令人满意,因为它意味着重复数据。


为何选择Guid?

这背后的原因是新Strategy将能够通过插件架构创建(提供StrategySubclassMap ,在应用程序加载时读取),因此我需要使用Guid因此与Ids没有冲突。

似乎在Strategy类中您使用的是类型为Guid Id ,但在mapper类中使用了string而不是Guid

我改变了地图类,如下所述,exception不再出现

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