Nhibernate 映射组件抛出AmbigousComponentReferenceException

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

我正在用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 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;}
}