表X中的关联引用了未映射的类:System.Guid

Ela*_*nda 8 .net c# nhibernate fluent-nhibernate

我有这门课:

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

}
Run Code Online (Sandbox Code Playgroud)

我有这个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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我注册:

SessionFactory = Fluently.Configure(configuration).Mappings(m =>
{
    m.FluentMappings.AddFromAssemblyOf<AttachmentLocaionMap>();           
    m.FluentMappings.AddFromAssemblyOf<FriendDetailsMap>();
}).BuildSessionFactory();
Run Code Online (Sandbox Code Playgroud)

我收到此运行时错误:

表Metadata_AttachmentLocation中的关联是指未映射的类:System.Guid

描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

异常详细信息:NHibernate.MappingException:表Metadata_AttachmentLocation中的关联引用未映射的类:System.Guid

来源错误:

第19行:第20行:第21行:SessionFactory = Fluently.Configure(configuration).Mappings(m =>第22行:{第23行:
m.FluentMappings.AddFromAssemblyOf();

源文件:C:\ Users\elad\Documents\Visual Studio 2010\Projects\SVN\UGI\Ugi\Infrastructure\Dal\Adapters\NHibernateAdapter\NHibernateHelper.cs行:21

堆栈跟踪:

[MappingException:表Metadata_AttachmentLocation中的关联引用未映射的类:System.Guid] NH:\ CSharp\NH\NH \nhibernate\src\NHibernate\Cfg\Configuration中的NHibernate.Cfg.Configuration.LogAndThrow(异常异常). cs:342
NHibernate.Cfg.Configuration.SecondPassCompileForeignKeys(表格,ISet完成)在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()在d:\ CSharp\NH\NH \nhibernate\src\NHibernate\Cfg\Configuration中.cs:1249
FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory()在d:\ Builds\FluentNH-v1.x-nh3\src\FluentNHibernate\Cfg\FluentConfiguration.cs:227

[FluentConfigurationException:创建SessionFactory时使用了无效或不完整的配置.检查PotentialReasons集合,以及InnerException以获取更多详细信息.

  • 未通过Database方法配置数据库.]
    FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory()在d:\ Builds\FluentNH-v1.x-nh3\src\FluentNHibernate\Cfg\FluentConfiguration.cs:232 Ugi.Infrastructure.Dal.Adapters.NHibernateAdapter.NHibernateHelper.OpenSession()在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()在C:\ Users\elad\Documents\Visual Studio 2010\Projects\SVN\UGI\Ugi\Infrastructure\Dal\Adapters\NHibernateAdapter\NHibernateHelper.cs:36 Ugi.Infrastructure.Dal.Adapters.NHibernateAdapter.NHibernateDal 1 resolverOverrides)in C:\ EntLib\UnityTemp \编译\统一\统一\ SRC\UnityContainer.cs:5121..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

[ResolutionFailedException:依赖项的解析失败,type ="Ugi.Common.Model.Sources.ISourcesService",name ="(none)".发生异常时:调用构造函数Ugi.Server.Sources.Logic.SourcesService().例外情况是:FluentConfigurationException - 创建SessionFactory时使用了无效或不完整的配置.检查PotentialReasons集合,以及InnerException以获取更多详细信息.

  • 未通过Database方法配置数据库.

我该如何解决这个问题?

TIA

Dan*_*sco 17

如果要在复合键中映射简单属性(它不是与ORM关联的"标准方式",但在某些情况下它可以帮助您),您可以使用KeyProperty而不是KeyReference以这种方式映射键:

CompositeId()
    .KeyProperty(x => x.UserId, "UserId")
    .KeyProperty(x => x.AttachmentId, "AttachmentId")
    .KeyProperty(x => x.LocationId, "LocationId");
Run Code Online (Sandbox Code Playgroud)

  • 这个似乎实际上回答了OP的问题. (2认同)

Die*_*hon 5

这些是错误的:

public virtual Guid UserId { get; set; }
public virtual Guid LocationId { get; set; }
Run Code Online (Sandbox Code Playgroud)

还有这些:

CompositeId()
    .KeyReference(x => x.UserId, "UserId")
    .KeyReference(x => x.Attachment.Id, "AttachmentId")
    .KeyReference(x => x.LocationId, "LocationId");
Run Code Online (Sandbox Code Playgroud)

你应该有适当的参考:

public virtual User User { get; set; }
public virtual Location Location { get; set; }
Run Code Online (Sandbox Code Playgroud)

和映射:

CompositeId()
    .KeyReference(x => x.User, "UserId")
    .KeyReference(x => x.Attachment, "AttachmentId")
    .KeyReference(x => x.Location, "LocationId");
Run Code Online (Sandbox Code Playgroud)