Hi,
I'm having trouble mapping with the DiscriminateSubClassesOnColumn and
DiscriminatorValue. Using FluentNHibernate.dll 1.0.0.578 .
A FormatException with message "Input string was not in a correct
format." is thrown from
D:\Builds\
NH2.1.0.GA\src\NHibernate\Type\Int16Type.cs #70 :
public override object FromStringValue(string xml)
{
return Int16.Parse(xml);
}
Here value xml is "Entities.Product" for some reason, why is that
since the generated mapping files uses value 1/2 ? Any ideas?
Thanks.
Mapping is as follows:
///////// Entities assembly ///////
namespace Entities
{
public abstract class Product {
public enum ProductType { Unknown=0, ProductA, ProductB }
public int Id { get; set; }
}
public class ProductA : Product { }
public class ProductB : Product { }
//--------------------------------------------------------------------------
// Mappings
//--------------------------------------------------------------------------
public class ProductMapping : FMapping.ClassMap<Product> {
public ProductMapping() {
Not.LazyLoad();
Id(c => c.Id).GeneratedBy.HiLo("1000");
DiscriminateSubClassesOnColumn<Int16>("ProductType");
}
}
public class ProductAMapping : FMapping.SubclassMap<ProductA> {
public ProductAMapping() {
Not.LazyLoad();
DiscriminatorValue((Int16)Product.ProductType.ProductA);
}
}
public class ProductBMapping : FMapping.SubclassMap<ProductB> {
public ProductBMapping() {
Not.LazyLoad();
DiscriminatorValue((Int16)Product.ProductType.ProductB);
}
}
}
///////////////////////////// Program /////////////////////////////
private static void Main(string[] args)
{
try
{
NHibernate.ISessionFactory factory = buildSessionFactory();
new FTesting.PersistenceSpecification<ProductA>(
factory.OpenSession())
.VerifyTheMappings();
}
catch (Exception ex)
{
string delim = string.Empty;
for (System.Exception inner=ex; inner!=null;
inner=inner.InnerException, delim+="\t")
Console.WriteLine(delim+inner.Message);
}
Console.ReadKey();
}
//--------------------------------------------------------------------------
// Configuration
//--------------------------------------------------------------------------
private static NHibernate.ISessionFactory buildSessionFactory()
{
var dbCfg = FDb.MsSqlConfiguration.MsSql2008
.ConnectionString(c => c
.Server("localhost")
.Database("FNHTest")
.Username("sa")
.Password("pwd"));
var cfg = FCfg.Fluently
.Configure().Database(dbCfg)
.Mappings(m => m
.FluentMappings.ExportTo("./"));
cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssembly(typeof
(Product).Assembly));
NHibernate.ISessionFactory factory = cfg.ExposeConfiguration
(buildSchema).BuildSessionFactory();
return factory;
}
private static void buildSchema(NHibernate.Cfg.Configuration cfg)
{
new NHibernate.Tool.hbm2ddl.SchemaExport(cfg)
.SetOutputFile(@"Schema.sql").Create(false,true);
}
}
/////////////////////////////
Entities.Product.hbm.xml /////////////////////////////
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-
access="property" auto-import="true" default-cascade="none" default-
lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" lazy="false"
name="Entities.Product, Entities, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null" table="`Product`">
<id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Id" />
<generator class="hilo">
<param name="max_lo">1000</param>
</generator>
</id>
<discriminator column="ProductType" type="Int16" insert="true" not-
null="true" />
<subclass name="Entities.ProductA, Entities, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null" discriminator-value="1"
lazy="false" />
<subclass name="Entities.ProductB, Entities, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null" discriminator-value="2"
lazy="false" />
</class>
</hibernate-mapping>
///////////////////////////// Callstack /////////////////////////////
NHibernate.dll!NHibernate.Type.Int16Type.FromStringValue(string xml
= "Entities.Product") Line 70 + 0xa bytes C#
NHibernate.dll!NHibernate.Type.Int16Type.StringToObject(string xml =
"Entities.Product") Line 65 + 0x18 bytes C#
> NHibernate.dll!NHibernate.Persister.Entity.SingleTableEntityPersister.SingleTableEntityPersis<snip> Line 254 + 0x73 bytes C#
NHibernate.dll!
NHibernate.Persister.PersisterFactory.CreateClassPersister
(NHibernate.Mapping.PersistentClass <snip> Line 51 + 0x43 bytes C#
NHibernate.dll!NHibernate.Impl.SessionFactoryImpl.SessionFactoryImpl
(NHibernate.Cfg.Configuration <snip> Line 223 + 0x1b bytes C#
NHibernate.dll!NHibernate.Cfg.Configuration.BuildSessionFactory()
Line 1134 + 0x74 bytes C#
FluentNHibernate.dll!
FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() Line 93
+ 0x1d bytes C#