1

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

它工作得很好。

任何帮助将不胜感激。

4

1 回答 1

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

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

于 2013-09-30T09:41:06.043 回答