Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

An association from the table X refers to an unmapped class: System.Guid

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.Guid

Description: 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.Guid

Source 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: 21

Stack 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() 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
    1 resolverOverrides) in 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

like image 985
Elad Benda Avatar asked Nov 26 '11 00:11

Elad Benda


2 Answers

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:

CompositeId()
    .KeyProperty(x => x.UserId, "UserId")
    .KeyProperty(x => x.AttachmentId, "AttachmentId")
    .KeyProperty(x => x.LocationId, "LocationId");
like image 154
Daniele Armanasco Avatar answered Sep 19 '22 12:09

Daniele Armanasco


These are wrong:

public virtual Guid UserId { get; set; }
public virtual Guid LocationId { get; set; }

And so are these:

CompositeId()
    .KeyReference(x => x.UserId, "UserId")
    .KeyReference(x => x.Attachment.Id, "AttachmentId")
    .KeyReference(x => x.LocationId, "LocationId");

You should have proper references:

public virtual User User { get; set; }
public virtual Location Location { get; set; }

And mapping:

CompositeId()
    .KeyReference(x => x.User, "UserId")
    .KeyReference(x => x.Attachment, "AttachmentId")
    .KeyReference(x => x.Location, "LocationId");
like image 38
Diego Mijelshon Avatar answered Sep 19 '22 12:09

Diego Mijelshon