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

时间:2014-01-28 10:38:07

标签: c# nhibernate design-patterns fluent-nhibernate

我正在尝试使用Fluent Nhibernate实现策略模式,灵感来自this blog post

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<Strategy>
{
    public StrategyMap()
    {
        this.Id(x => x.Id).GeneratedBy.Assigned();
        this.DiscriminateSubClassesOnColumn("Id");
    }
}

public class MyStrategyMap : SubclassMap<MyStrategy>
{
    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<Strategy>();

    // Assert
    Assert.IsNotNull(strategies.FirstOrDefault());
}

抛出以下异常:

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

任何有关调试此问题的帮助都将受到赞赏,因为我无法弄清楚为什么这不起作用。


不满意的解决方案

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


为什么选择Guid?

这背后的原因是新的Strategy将能够通过插件架构创建(提供StrategySubclassMap<[strategy-name]>的实现,可以在应用程序加载时读取,因此我需要使用Guid s,因此与Ids没有冲突。

1 个答案:

答案 0 :(得分:2)

策略类中,您使用Id类型Guid 但是在mapper类中使用了string而不是Guid

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

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