尝试实现策略模式时的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
将能够通过插件架构创建(提供Strategy
和SubclassMap
,在应用程序加载时读取),因此我需要使用Guid
因此与Ids没有冲突。
似乎在Strategy类中您使用的是类型为Guid
Id
,但在mapper类中使用了string
而不是Guid
。
我改变了地图类,如下所述,exception不再出现
public class MyStrategyMap : SubclassMap { public MyStrategyMap() { this.DiscriminatorValue(new Guid("F1CF041B ...")); } }
- 如何在Windows Phone 7上将BitmapImage的大小调整为50×50?
- 如何检查form2上的复选框时Form1 label.text更改?
- 如何通过MSTest在集成测试期间托管VS IDE?
- 与asp.net的jquery ajax无法正常工作
- 如何使用ItemsSource和DataTemplates从数据对象呈现function区
- EventStore + RavenDB,没有反序列化正确
- 序列化和反序列化Visual Studio解决方案文件 – 或以编程方式编辑?
- Service Stack / MVC:“AppHostBase.Instance已设置”错误 – 但无法理解为什么/如何防止
- 具有动态maxCount的SemaphoreSlim