Nhibernate 映射组件抛出AmbigousComponentReferenceException
我正在用Fluent NHibernate配置映射 因此,我有一个组件定义如下:Nhibernate 映射组件抛出AmbigousComponentReferenceException,nhibernate,fluent-nhibernate,fluent-nhibernate-mapping,Nhibernate,Fluent Nhibernate,Fluent Nhibernate Mapping,我正在用Fluent NHibernate配置映射 因此,我有一个组件定义如下: public class Tracking { public virtual string CreatedBy { get; set; } public virtual DateTime CreatedOn { get; set; } public virtual string UpdatedBy { get; set; } public virtual DateTime Updat
public class Tracking
{
public virtual string CreatedBy { get; set; }
public virtual DateTime CreatedOn { get; set; }
public virtual string UpdatedBy { get; set; }
public virtual DateTime UpdatedOn { get; set; }
public virtual string DeletedBy { get; set; }
public virtual DateTime DeletedOn { get; set; }
public Tracking()
{
CreatedBy = Environment.UserName;
UpdatedBy = Environment.UserName;
}
}
使用以下映射对其进行映射:
class TrackingMap : ComponentMap<Tracking>
{
public TrackingMap()
{
Map(c => c.CreatedBy);
Map(c => c.CreatedOn);
Map(c => c.UpdatedBy);
Map(c => c.UpdatedOn);
Map(c => c.DeletedBy);
Map(c => c.DeletedOn);
}
}
class MissionMap : ClassMap<Mission>
{
public MissionMap()
{
Id(x => x.Id);
Map(x => x.Name);
Component(x => x.Tracking);
}
}
使用相应的映射:
class TrackingMap : ComponentMap<Tracking>
{
public TrackingMap()
{
Map(c => c.CreatedBy);
Map(c => c.CreatedOn);
Map(c => c.UpdatedBy);
Map(c => c.UpdatedOn);
Map(c => c.DeletedBy);
Map(c => c.DeletedOn);
}
}
class MissionMap : ClassMap<Mission>
{
public MissionMap()
{
Id(x => x.Id);
Map(x => x.Name);
Component(x => x.Tracking);
}
}
类任务映射:类映射
{
公共任务地图()
{
Id(x=>x.Id);
Map(x=>x.Name);
分量(x=>x.0);
}
}
我的问题当我构建会话工厂时,我有一个FluentConfigurationException消息
“跟踪”的多个外部组件,从属性引用
“任务”的“跟踪”,无法继续
但是,当我使用内联映射时:
class MissionMap : ClassMap<Mission>
{
public MissionMap()
{
Id(x => x.Id);
Map(x => x.Name);
Component(x => x.Tracking, m =>
{
m.Map(c => c.CreatedBy);
m.Map(c => c.CreatedOn);
m.Map(c => c.UpdatedBy);
m.Map(c => c.UpdatedOn);
m.Map(c => c.DeletedBy);
m.Map(c => c.DeletedOn);
});
}
}
类任务映射:类映射
{
公共任务地图()
{
Id(x=>x.Id);
Map(x=>x.Name);
组件(x=>x.跟踪,m=>
{
m、 Map(c=>c.CreatedBy);
m、 Map(c=>c.CreatedOn);
m、 Map(c=>c.UpdatedBy);
m、 Map(c=>c.UpdatedOn);
m、 Map(c=>c.DeletedBy);
m、 Map(c=>c.DeletedOn);
});
}
}
它工作得很好
任何帮助都将不胜感激。事实上,通过以下测试和一些细微的修改,您的代码对我来说运行良好,能够持久化对象 您确定没有在同一程序集中的某个地方保留未注释的旧代码吗?只有当一个实体有多个提供程序(映射)可用时,才会引发异常。这意味着
跟踪的映射也在其他地方定义
一些测试设置:
var sessionFactory = Fluently.Configure()
.Database(FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2000
.ConnectionString(@"Server=.\SQLExpress;Database=TestDB;Trusted_Connection=True;")
.ShowSql)
.Mappings(m => m.FluentMappings
.AddFromAssemblyOf<MissionMap>())
.ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(false, true))
.BuildSessionFactory();
using (var session = sessionFactory.OpenSession())
{
var rr = session.Get<Mission>(1);
if (rr == null) {
var mission = new Mission()
{
Name = "some name",
Tracking = new Tracking()
};
session.Save(mission);
}
if (rr != null)
{
rr.Tracking.UpdatedBy = "me";
rr.Tracking.UpdatedOn = DateTime.Now;
session.Update(rr);
}
//if (rr != null)
//{
// session.Delete(rr);
//}
session.Flush();
}
var sessionFactory=fluntly.Configure()
.数据库(FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2000
.ConnectionString(@“服务器=。\SQLExpress;数据库=TestDB;受信任的\u连接=True;”)
.ShowSql)
.Mappings(m=>m.FluentMappings
.AddFromAssemblyOf())
.ExposeConfiguration(cfg=>newschemaupdate(cfg).Execute(false,true))
.BuildSessionFactory();
使用(var session=sessionFactory.OpenSession())
{
var rr=session.Get(1);
if(rr==null){
var任务=新任务()
{
Name=“some Name”,
跟踪=新跟踪()
};
会议.拯救(特派团);
}
如果(rr!=null)
{
rr.Tracking.UpdatedBy=“我”;
rr.Tracking.UpdatedOn=DateTime.Now;
更新(rr);
}
//如果(rr!=null)
//{
//删除(rr);
//}
session.Flush();
}
变更实体
public class Tracking
{
public virtual int Id { get; set; }
public virtual string CreatedBy { get; set; }
public virtual DateTime CreatedOn { get; set; }
public virtual string UpdatedBy { get; set; }
public virtual DateTime UpdatedOn { get; set; }
public virtual string DeletedBy { get; set; }
public virtual DateTime? DeletedOn { get; set; } // deletedon should be nullable
public Tracking()
{
CreatedBy = Environment.UserName;
CreatedOn = DateTime.Now;
UpdatedBy = Environment.UserName;
UpdatedOn = DateTime.Now;
}
}
public class Mission
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual Tracking Tracking { get; set; }
}
class MissionMap : ClassMap<Mission>
{
public MissionMap()
{
Id(x => x.Id);
Map(x => x.Name);
Component(x => x.Tracking);
}
}
class TrackingMap : ComponentMap<Tracking>
{
public TrackingMap()
{
Map(c => c.CreatedBy);
Map(c => c.CreatedOn);
Map(c => c.UpdatedBy);
Map(c => c.UpdatedOn);
Map(c => c.DeletedBy);
Map(c => c.DeletedOn);
}
}
公共类跟踪
{
公共虚拟整数Id{get;set;}
由{get;set;}创建的公共虚拟字符串
公共虚拟日期时间CreatedOn{get;set;}
由{get;set;}更新的公共虚拟字符串
公共虚拟日期时更新{get;set;}
公共虚拟字符串DeletedBy{get;set;}
公共虚拟日期时间?DeletedOn{get;set;}//DeletedOn应为空
公众追踪()
{
CreatedBy=Environment.UserName;
CreatedOn=DateTime.Now;
UpdatedBy=Environment.UserName;
UpdatedOn=DateTime.Now;
}
}
公课使命
{
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟跟踪{get;set;}
}
类任务映射:类映射
{
公共任务地图()
{
Id(x=>x.Id);
Map(x=>x.Name);
分量(x=>x.0);
}
}
类TrackingMap:ComponentMap
{
公共跟踪地图()
{
Map(c=>c.CreatedBy);
Map(c=>c.CreatedOn);
Map(c=>c.UpdatedBy);
Map(c=>c.UpdatedOn);
Map(c=>c.DeletedBy);
Map(c=>c.DeletedOn);
}
}
这将把跟踪数据存储到与任务数据相同的表中(这是组件的意图)。实际上,通过以下测试和一些轻微的修改,您的代码对我来说运行良好,能够持久化对象
您确定没有在同一程序集中的某个地方保留未注释的旧代码吗?只有当一个实体有多个提供程序(映射)可用时,才会引发异常。这意味着跟踪的映射也在其他地方定义
一些测试设置:
var sessionFactory = Fluently.Configure()
.Database(FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2000
.ConnectionString(@"Server=.\SQLExpress;Database=TestDB;Trusted_Connection=True;")
.ShowSql)
.Mappings(m => m.FluentMappings
.AddFromAssemblyOf<MissionMap>())
.ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(false, true))
.BuildSessionFactory();
using (var session = sessionFactory.OpenSession())
{
var rr = session.Get<Mission>(1);
if (rr == null) {
var mission = new Mission()
{
Name = "some name",
Tracking = new Tracking()
};
session.Save(mission);
}
if (rr != null)
{
rr.Tracking.UpdatedBy = "me";
rr.Tracking.UpdatedOn = DateTime.Now;
session.Update(rr);
}
//if (rr != null)
//{
// session.Delete(rr);
//}
session.Flush();
}
var sessionFactory=fluntly.Configure()
.数据库(FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2000
.ConnectionString(@“服务器=。\SQLExpress;数据库=TestDB;受信任的\u连接=True;”)
.ShowSql)
.Mappings(m=>m.FluentMappings
.AddFromAssemblyOf())
.ExposeConfiguration(cfg=>newschemaupdate(cfg).Execute(false,true))
.BuildSessionFactory();
使用(var session=sessionFactory.OpenSession())
{
var rr=session.Get(1);
if(rr==null){
var任务=新任务()
{
Name=“some Name”,
跟踪=新跟踪()
};
会议.拯救(特派团);
}
如果(rr!=null)
{
rr.Tracking.UpdatedBy=“我”;
rr.Tracking.UpdatedOn=DateTime.Now;
更新(rr);
}
//如果(rr!=null)
//{
//删除(rr);
//}
session.Flush();
}
变更实体
public class Tracking
{
public virtual int Id { get; set; }
public virtual string CreatedBy { get; set; }
public virtual DateTime CreatedOn { get; set; }
public virtual string UpdatedBy { get; set; }
public virtual DateTime UpdatedOn { get; set; }
public virtual string DeletedBy { get; set; }
public virtual DateTime? DeletedOn { get; set; } // deletedon should be nullable
public Tracking()
{
CreatedBy = Environment.UserName;
CreatedOn = DateTime.Now;
UpdatedBy = Environment.UserName;
UpdatedOn = DateTime.Now;
}
}
public class Mission
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual Tracking Tracking { get; set; }
}
class MissionMap : ClassMap<Mission>
{
public MissionMap()
{
Id(x => x.Id);
Map(x => x.Name);
Component(x => x.Tracking);
}
}
class TrackingMap : ComponentMap<Tracking>
{
public TrackingMap()
{
Map(c => c.CreatedBy);
Map(c => c.CreatedOn);
Map(c => c.UpdatedBy);
Map(c => c.UpdatedOn);
Map(c => c.DeletedBy);
Map(c => c.DeletedOn);
}
}
公共类跟踪
{
公共虚拟整数Id{get;set;}
由{get;set;}创建的公共虚拟字符串
公共虚拟日期时间CreatedOn{get;set;}
由{get;set;}更新的公共虚拟字符串
公共虚拟日期时更新{get;set;}
公共虚拟字符串DeletedBy{get;set;}
公共虚拟日期时间?DeletedOn{get;set;}//DeletedOn应为空
公众追踪()
{
CreatedBy=Environment.UserName;
CreatedOn=DateTime.Now;
UpdatedBy=Environment.UserName;
UpdatedOn=DateTime.Now;
}
}
公课使命
{
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟跟踪{get;set;}
}