我正在使用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);
});
}
}
效果很好。
非常感谢任何帮助。
答案 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);
}
}
这会将跟踪数据存储到与任务数据相同的表中(这是组件的意图)。