我正在尝试使用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列(因此创建另一列来区分)来获得代码,但我发现这不令人满意,因为它意味着重复数据。
这背后的原因是新的Strategy
将能够通过插件架构创建(提供Strategy
和SubclassMap<[strategy-name]>
的实现,可以在应用程序加载时读取,因此我需要使用Guid
s,因此与Ids没有冲突。
答案 0 :(得分:2)
在策略类中,您使用Id
类型Guid
但是在mapper类中使用了string
而不是Guid
。
我改变了地图类,如下所述,异常不再出现
public class MyStrategyMap : SubclassMap<MyStrategy>
{
public MyStrategyMap()
{
this.DiscriminatorValue(new Guid("F1CF041B ..."));
}
}