1

我配置与功能NHibernate映射。映射组件抛出AmbigousComponentReferenceException

所以,我有一个组件定义如下:

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

其实你的代码工作正常,我用下面的测试和一些很小的改动就能够持久化对象...

你确定你没有离开你的旧代码取消注释的地方在同一程序?只有当您有多个提供者(映射)可供一个实体使用时,才会抛出异常。这意味着地图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); 
    } 
} 

这将跟踪数据存储到同一张桌子使命数据(这是Component的意图)。

+0

谢谢你的回答。正如它为你工作,我看着我的配置,并发现问题是什么。我会在稍后发布解决方案。 –