对baseclass对象的NHibernate Session刷新调用会导致无效的强制转换异常

时间:2012-03-13 17:11:06

标签: nhibernate fluent-nhibernate nhibernate-mapping

我正在使用以下两个类的流畅映射:

1.应用类:

  public ThirdPartyAppMap()
    {
        Schema("Data");
        Id(x => x.ThirdPartyAppId).GeneratedBy.Identity();
        Map(x => x.AppName);
        Map(x => x.CreationTime);
        Map(x => x.Enabled);
        References(x => x.ThirdPartyCustomer, "ThirdPartyCustomerId").Class(typeof(ThirdPartyCustomer));
        HasMany(x => x.ThirdPartyUsersIds).Table("Data.ThirdPartyUser").KeyColumn("ThirdPartyAppId").Element("UserId").AsBag();
    }

这是我核心域中的一个简单应用程序

及其子类:ApplicationExt mapping:

 public ThirdPartyAppProxExtMap()
    {
        Table("Data.ThirdPartyApp");
        KeyColumn("ThirdPartyAppId");
        this.HasManyIds(x => x.DeviceToAppRelIds, "Data.ThirdPartyDeviceToAppRel", "AppId", "ThirdPartyDeviceToAppRelId");
    }

哪个映射到同一个表但添加了一个hasmany属性,这是一个id列表。 此类位于更高级别的域中,该域基于核心域, 核心域不需要知道应用程序类的rels,而更高的域域。

映射工作正常,但在使用NH会话对象时遇到异常:

当我打电话

Session.Refresh(BaseAppObject)

我收到以下例外:

Unable to cast object of type 'RedPill.Applicative.Module.CM.Domain.ThirdPartyApp' to type 'RedPill.Applicative.Module.PI.Domain.ThirdPartyAppProxExt'.

它抛出invalidcastexception,因为它试图将数据分配给BaseAppObject上不存在的扩展类型属性,仅在ExtAppObject上。 查看分析器,sesion对象尝试获取ExtApplicationObject而不是BaseApplicationObject。 所以基本上,我做了Session.Get(),接收了BaseAppObject,它工作正常,但当我尝试使用Session.Refresh()刷新它时,它尝试获取ExtApplicationObject,当NH尝试从选择中构建对象时,它会抛出无效施放异常。

对此有何帮助?

问候,

詹姆斯

1 个答案:

答案 0 :(得分:0)

您尝试在单个表中使用table-per-class,但由于多种原因而失败。使用鉴别器

更改为多个表或每个层次的表