映射组件抛出AmbigousComponentReferenceException

时间:2013-09-30 08:15:25

标签: 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 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);
    }
}

然后,我有另一个引用该组件的类:

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);
    }
}

我的问题当我构建会话工厂时,我有 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);
        });
    }
}

效果很好。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

实际上,通过以下测试,您的代码可以正常工作,并进行一些细微的修改,以便能够持久保存对象......

你确定你没有在同一个程序集中的某处取消注释旧代码吗?仅当您有一个实体可用多个提供程序(映射)时,才会抛出异常。这意味着Tracking的地图也在其他地方定义......

一些测试设置:

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();
}

更改实体

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);
    }
}

这会将跟踪数据存储到与任务数据相同的表中(这是组件的意图)。