I'm trying to understand usage of SUBCLASS attribute of NHibernate.Mapping.Attributes. Following is the class the i made for testing
using NHibernate.Mapping.Attributes;
namespace SecurityClass1
{
[Class(0, Table = "attachment")]
[Serializable]
public abstract class Attachment
{
[Id(0, Name = "Id", TypeType = typeof(Guid), UnsavedValue = "00000000-0000-0000-0000-000000000000")]
[Generator(1, Class = "guid.comb")]
[Create(2)]
public virtual Guid Id {
get; set;}
[Discriminator(0, Column="attachment_type",Type="string")]
[Create(1)]
public virtual string attachment_type { set; get;}
[Property(0, NotNull = true,TypeType=typeof(String))]
[Create(1)]
public virtual string sentBy { set; get; }
}
[Subclass(0, Name = "ImageAttachment", DiscriminatorValue = "IMG", ExtendsType = typeof(Attachment) )]
[Serializable]
public class ImageAttachment: Attachment
{
[Property(0, Column = "image_size_width")]
[Create(1)]
public virtual float imageSizeWidth { get; set; }
[Property(0)]
[Create(1)]
public virtual float imageSizeHeight { get; set; }
}
[Subclass(0, Name = "TextAttachment", DiscriminatorValue = "TXT", ExtendsType = typeof(Attachment))]
[Serializable]
public class TextAttachment : Attachment
{
[Property(0, Column = "image_size_width")]
[Create(1)]
public virtual float textsize { get; set; }
}
}
and the code inside NHibernate class is (to generate the schema at runtime)
using System.IO;
using NHibernate;
using NHibernate.Cfg;
namespace SecurityClass1
{
public class NHibernateHelper
{
private static readonly ISessionFactory sessionFactory;
private static ISession session;
static NHibernateHelper()
{
Configuration conf = new Configuration().Configure();
System.IO.MemoryStream stream = new MemoryStream();
NHibernate.Mapping.Attributes.HbmSerializer.Default.Serialize(stream,
System.Reflection.Assembly.
GetExecutingAssembly());
stream.Position = 0;
conf.AddInputStream(stream);
stream.Close();
new NHibernate.Tool.hbm2ddl.SchemaExport(conf).Create(true, true);
sessionFactory = conf.BuildSessionFactory();
}
public static ISession getSession()
{
if (session == null)
session = sessionFactory.OpenSession();
return session;
}
}
}
When I trz to run this code i'm getting following error.
System.TypeInitializationException was unhandled
Message="The type initializer for 'SecurityClass1.NHibernateHelper' threw an exception."
Source="SecurityClass1"
TypeName="SecurityClass1.NHibernateHelper"
StackTrace:
at SecurityClass1.NHibernateHelper.getSession()
at SecurityClass1.SecurityPermissionDemo.Main(String[] args) in D:\C Sharp\SecurityClass1\SecurityClass1\Program.cs:line 26
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException: NHibernate.MappingException
Message="Could not compile the mapping document: (unknown)"
Source="NHibernate"
StackTrace:
at NHibernate.Cfg.Configuration.LogAndThrow(Exception exception) in c:\DATA\Projects\nhibernate\2.0.x\copy1\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 262
at NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc) in c:\DATA\Projects\nhibernate\2.0.x\copy1\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 436
at NHibernate.Cfg.Configuration.ProcessMappingsQueue() in c:\DATA\Projects\nhibernate\2.0.x\copy1\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 1557
at NHibernate.Cfg.Configuration.AddDocumentThroughQueue(NamedXmlDocument document) in c:\DATA\Projects\nhibernate\2.0.x\copy1\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 1548
at NHibernate.Cfg.Configuration.AddXmlReader(XmlReader hbmReader, String name) in c:\DATA\Projects\nhibernate\2.0.x\copy1\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 1541
at NHibernate.Cfg.Configuration.AddInputStream(Stream xmlInputStream, String name) in c:\DATA\Projects\nhibernate\2.0.x\copy1\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 506
at NHibernate.Cfg.Configuration.AddInputStream(Stream xmlInputStream) in c:\DATA\Projects\nhibernate\2.0.x\copy1\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 480
at SecurityClass1.NHibernateHelper..cctor() in D:\C Sharp\SecurityClass1\SecurityClass1\NHibernateHelper.cs:line 32
InnerException: NHibernate.MappingException
Message="persistent class ImageAttachment not found"
Source="NHibernate"
StackTrace:
at NHibernate.Cfg.XmlHbmBinding.Binder.ClassForFullNameChecked(String fullName, String errorMessage) in c:\DATA\Projects\nhibernate\2.0.x\copy1\nhibernate\src\NHibernate\Cfg\XmlHbmBinding\Binder.cs:line 69
at NHibernate.Cfg.XmlHbmBinding.ClassBinder.BindClass(XmlNode node, PersistentClass model) in c:\DATA\Projects\nhibernate\2.0.x\copy1\nhibernate\src\NHibernate\Cfg\XmlHbmBinding\ClassBinder.cs:line 112
at NHibernate.Cfg.XmlHbmBinding.SubclassBinder.HandleSubclass(PersistentClass model, XmlNode subnode) in c:\DATA\Projects\nhibernate\2.0.x\copy1\nhibernate\src\NHibernate\Cfg\XmlHbmBinding\SubclassBinder.cs:line 30
at NHibernate.Cfg.XmlHbmBinding.SubclassBinder.Bind(XmlNode node) in c:\DATA\Projects\nhibernate\2.0.x\copy1\nhibernate\src\NHibernate\Cfg\XmlHbmBinding\SubclassBinder.cs:line 23
at NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.AddSubclasses(XmlNode parentNode) in c:\DATA\Projects\nhibernate\2.0.x\copy1\nhibernate\src\NHibernate\Cfg\XmlHbmBinding\MappingRootBinder.cs:line 91
at NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.Bind(XmlNode node) in c:\DATA\Projects\nhibernate\2.0.x\copy1\nhibernate\src\NHibernate\Cfg\XmlHbmBinding\MappingRootBinder.cs:line 31
at NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc) in c:\DATA\Projects\nhibernate\2.0.x\copy1\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 431
InnerException: System.TypeLoadException
Message="Could not load type ImageAttachment. Possible cause: no assembly name specified."
Source="NHibernate"
TypeName=""
StackTrace:
at NHibernate.Util.ReflectHelper.TypeFromAssembly(AssemblyQualifiedTypeName name, Boolean throwOnError) in c:\DATA\Projects\nhibernate\2.0.x\copy1\nhibernate\src\NHibernate\Util\ReflectHelper.cs:line 284
at NHibernate.Util.ReflectHelper.ClassForName(String name) in c:\DATA\Projects\nhibernate\2.0.x\copy1\nhibernate\src\NHibernate\Util\ReflectHelper.cs:line 174
at NHibernate.Cfg.XmlHbmBinding.Binder.ClassForFullNameChecked(String fullName, String errorMessage) in c:\DATA\Projects\nhibernate\2.0.x\copy1\nhibernate\src\NHibernate\Cfg\XmlHbmBinding\Binder.cs:line 65
InnerException:
I'm sitting on this for last two days and couldn't figure out why it fails. Can any one help me?
Madhu
|