I have this class:
public class AttachmentLocation
{
#region properties
public virtual Guid UserId { get; set; }
public virtual Guid LocationId { get; set; }
public virtual long IndexInLocation { get; set; }
#endregion
#region contained foreign objects
public virtual Attachment Attachment { get; set; }
#endregion
#region Methods need to override for CompositeId
public override bool Equals(object obj)
{
if (obj == null)
return false;
var t = obj as AttachmentLocation;
if (t == null)
return false;
if (UserId == t.UserId && LocationId == t.LocationId && Attachment.Id == t.Attachment.Id)
return true;
return false;
}
public override int GetHashCode()
{
return (UserId + "|" + LocationId + "|" + Attachment.Id).GetHashCode();
}
#endregion
}
I have this Fluent Mapping:
public class AttachmentLocaionMap : ClassMap<AttachmentLocation>
{
public AttachmentLocaionMap()
{
Table("Metadata_AttachmentLocation");
CompositeId()
.KeyReference(x => x.UserId, "UserId")
.KeyReference(x => x.Attachment.Id, "AttachmentId")
.KeyReference(x => x.LocationId, "LocationId");
Map(x => x.IndexInLocation).Not.Nullable();
Map(x => x.LocationId).Not.Nullable();
HasOne(x => x.Attachment);
}
}
which I register:
SessionFactory = Fluently.Configure(configuration).Mappings(m =>
{
m.FluentMappings.AddFromAssemblyOf<AttachmentLocaionMap>();
m.FluentMappings.AddFromAssemblyOf<FriendDetailsMap>();
}).BuildSessionFactory();
I get this runtime error:
An association from the table Metadata_AttachmentLocation refers to an
unmapped class: System.GuidDescription: An unhandled exception occurred during the execution of
the current web request. Please review the stack trace for more
information about the error and where it originated in the code.Exception Details: NHibernate.MappingException: An association from
the table Metadata_AttachmentLocation refers to an unmapped class:
System.GuidSource Error:
Line 19: Line 20: Line 21: SessionFactory =
Fluently.Configure(configuration).Mappings(m => Line 22: {
Line 23:
m.FluentMappings.AddFromAssemblyOf();Source File: C:\Users\elad\Documents\Visual Studio
2010\Projects\SVN\UGI\Ugi\Infrastructure\Dal\Adapters\NHibernateAdapter\NHibernateHelper.cs
Line: 21Stack Trace:
[MappingException: An association from the table
Metadata_AttachmentLocation refers to an unmapped class: System.Guid]
NHibernate.Cfg.Configuration.LogAndThrow(Exception exception) in
d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:342
NHibernate.Cfg.Configuration.SecondPassCompileForeignKeys(Table table,
ISet done) in
d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:1169
NHibernate.Cfg.Configuration.SecondPassCompile() in
d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:1120
NHibernate.Cfg.Configuration.BuildSessionFactory() in
d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:1249
FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() in
d:\Builds\FluentNH-v1.x-nh3\src\FluentNHibernate\Cfg\FluentConfiguration.cs:227[FluentConfigurationException: An invalid or incomplete configuration
was used while creating a SessionFactory. Check PotentialReasons
collection, and InnerException for more detail.
- Database was not configured through Database method. ]
FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() in
d:\Builds\FluentNH-v1.x-nh3\src\FluentNHibernate\Cfg\FluentConfiguration.cs:232
Ugi.Infrastructure.Dal.Adapters.NHibernateAdapter.NHibernateHelper.OpenSession()
in C:\Users\elad\Documents\Visual Studio
2010\Projects\SVN\UGI\Ugi\Infrastructure\Dal\Adapters\NHibernateAdapter\NHibernateHelper.cs:21
Ugi.Infrastructure.Dal.Adapters.NHibernateAdapter.NHibernateHelper.GetSession()
in C:\Users\elad\Documents\Visual Studio
2010\Projects\SVN\UGI\Ugi\Infrastructure\Dal\Adapters\NHibernateAdapter\NHibernateHelper.cs:36
Ugi.Infrastructure.Dal.Adapters.NHibernateAdapter.NHibernateDal1..ctor()
1 resolverOverrides) in
in C:\Users\elad\Documents\Visual Studio
2010\Projects\SVN\UGI\Ugi\Infrastructure\Dal\Adapters\NHibernateAdapter\NHibernateDal.cs:16
Ugi.Infrastructure.Dal.Adapters.NHibernateAdapter.NHibernateDalFactory.GetDal()
in C:\Users\elad\Documents\Visual Studio
2010\Projects\SVN\UGI\Ugi\Infrastructure\Dal\Adapters\NHibernateAdapter\NHibernateDalFactory.cs:17
Ugi.Server.Sources.Logic.SourcesService..ctor() in
C:\Users\elad\Documents\Visual Studio
2010\Projects\SVN\UGI\Ugi\Server\Sources\Logic\SourcesService.cs:36
BuildUp_Ugi.Server.Sources.Logic.SourcesService(IBuilderContext ) +153
Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext
context) in
c:\EntLib\UnityTemp\Compile\Unity\Unity\Src\ObjectBuilder\Strategies\BuildPlan\DynamicMethod\DynamicMethodBuildPlan.cs:37
Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext
context) in
c:\EntLib\UnityTemp\Compile\Unity\Unity\Src\ObjectBuilder\Strategies\BuildPlan\BuildPlanStrategy.cs:43
Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext
context) in
c:\EntLib\UnityTemp\Compile\Unity\Unity\Src\ObjectBuilder\Strategies\StrategyChain.cs:110
Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object
existing, String name, IEnumerable
c:\EntLib\UnityTemp\Compile\Unity\Unity\Src\UnityContainer.cs:512[ResolutionFailedException: Resolution of the dependency failed, type
= "Ugi.Common.Model.Sources.ISourcesService", name = "(none)". Exception occurred while: Calling constructor
Ugi.Server.Sources.Logic.SourcesService(). Exception is:
FluentConfigurationException – An invalid or incomplete configuration
was used while creating a SessionFactory. Check PotentialReasons
collection, and InnerException for more detail.
- Database was not configured through Database method.
How can I fix that?
TIA
Best Answer
If you want to map simple properties in a composite key (it's not a "standard way" of relating things with a ORM, but in some cases it could help you) you can map the key using KeyProperty instead of KeyReference in this way: