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)
这些是错误的:
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)