我一直在使用joinsubclass inheritence mapping一段时间,并决定切换到每个类的表,因为它允许更有效的子类型解析。但是在进行更改时,我现在得到以下异常。
Object with id: 1 was not of the specified subclass: MyModel.FooBase (Discriminator was: '2')
简要课程如下。
public abstract FooBase
{
/* snip other properties */
public virtual string Name { get;set; }
public virtual IList<Child> Children { get; set; }
}
public class Bar : FooBase
{
public virtual string NickName { get;set; }
}
public class Child
{
public virtual FooBase Parent { get;set; }
}
和映射
public sealed class ChildMap : ClassMap<Child>
{
public ChildMap()
{
/*snip*/
References(x => x.Parent).ColumnName("ParentId");
}
}
public sealed class FooBaseMap : ClassMap<FooBase>
{
public FooBaseMap()
{
/*snip*/
HasMany(x => x. Children)
.AsBag().Cascade
.AllDeleteOrphan()
.KeyColumnNames.Add("ParentId")
.Inverse();
DiscriminateSubClassesOnColumn<int>("FooType")
.SubClass<Bar>(Types.Bar, m => m.Map(x => x.NickName))
}
}
事实证明,此异常通常出现在未指定where属性的多态集合上。不是这里的情况。我玩弄FooBase并不抽象,这没什么区别。没有想到更改映射策略会导致除了必须在子类上拥有可为空的列之外的任何问题。
令人困惑的是我没有指定子类,因为这是一个多态父类,我只是尝试访问基本属性,在这种情况下是Name。
非常感谢,
答案 0 :(得分:3)
好的我在问到这个问题之后总是找到问题:(
无论如何,这是使用Enum作为解决方案的映射问题。
DiscriminateSubClassesOnColumn<int>("FooType")
.SubClass<Bar>(Types.Bar, m => m.Map(x => x.NickName))
类型是一个枚举,我曾经允许我不要忘记用作描述符的整数(整数的原因是它们比数据库查找中的字符串更快)。
This问题意味着您可以直接使用Enums作为自3892以来的描述者,所以我尝试过。
DiscriminateSubClassesOnColumn<Types>("FooType")
.SubClass<Bar>(Types.Bar, m => m.Map(x => x.NickName))
没用,所以我试过
DiscriminateSubClassesOnColumn<Types>("FooType")
.SubClass<Bar>("Bar", m => m.Map(x => x.NickName))
也没有工作,所以我最终解决了下面的工作。
DiscriminateSubClassesOnColumn<int>("FooType")
.SubClass<Bar>((int)Types.Bar, m => m.Map(x => x.NickName))