ObservationUnits的映射代码:
Table("ObservationUnits");
Cache.ReadWrite().IncludeAll();
LazyLoad();
Id(x => x.Id)
.Column("ID")
.CustomType("Guid")
.Access.Property()
.CustomSqlType("UNIQUEIDENTIFIER")
.Not.Nullable()
.GeneratedBy.GuidComb()
;
......Other Mappings.....
Map(x => x.Number)
.Column("Number")
.CustomType("int")
.Access.Property()
.Generated.Never()
.Not.Nullable()
.CustomSqlType("INT")
;
HasMany(x => x.Partitions)
.Access.Property()
.AsSet()
.Cascade.DeleteOrphan()
.LazyLoad()
//.OptimisticLock().Version()
.Inverse()
.OrderBy("ID ASC")
.Generic()
.ForeignKeyConstraintName("FK_Partitions_ObservationUnits")
.KeyColumns.Add("PartitionID", mapping => mapping.Name("PartitionID")
.SqlType("UNIQUEIDENTIFIER")
.Not.Nullable())
;
分区映射代码:
Table("Partitions");
Cache.ReadWrite().IncludeAll();
LazyLoad();
Id(x => x.Id)
.Column("ID")
.CustomType("Guid")
.Access.Property()
.CustomSqlType("UNIQUEIDENTIFIER")
.Not.Nullable()
.GeneratedBy.GuidComb()
;
......Other Mappings.....
References(x => x.ObservationUnit)
.Class<ObservationUnit>()
.Access.Property()
.Cascade.SaveUpdate()
.LazyLoad()
.Not.Nullable()
.Columns("ObservationUnitID")
;
HasMany(x => x.Fragments)
.Access.Property()
.AsSet()
.Cascade.All()
.LazyLoad()
//.OptimisticLock().Version()
.Inverse()
.OrderBy("Number ASC")
.Generic()
.ForeignKeyConstraintName("FK_Fragments_Partitions")
.KeyColumns.Add("PartitionID", mapping => mapping.Name("PartitionID")
.SqlType("UNIQUEIDENTIFIER")
.Not.Nullable())
;
片段的映射代码(它是继承类型映射):
Table("Fragments");
Cache.ReadWrite().IncludeAll();
LazyLoad();
UseUnionSubclassForInheritanceMapping();
Id(x => x.Id)
.Column("ID")
.CustomType("Guid")
.Access.Property()
.CustomSqlType("UNIQUEIDENTIFIER")
.Not.Nullable()
.GeneratedBy.GuidComb()
;
......Other Mappings.....
References(x => x.Partition)
.Class<Partition>()
.Access.Property()
.Cascade.All()
.LazyLoad()
.Not.Nullable()
.Columns("PartitionID")
;
大家好,
我想知道是否有任何方法可以在表"ObservationUnit"-"Partition"-"Fragment"之间使用上述映射到FNH来放置下面2个提到的场景。
场景1:简单地将一条记录插入到所有这些记录中。1联络观察股1返回到分区1返回到Fragment
只使用一次提交到UnitOfWork(它是通过存储库模式实现的)提交将被放置到ObservationUnit(其余的都是Aggregate)。例如:如果提交失败(没有对ObservationUnit实体的记录),应该放置一个回滚,以避免分区和片段表之间的任何持久更改。
场景2:有条理地插入到所有这些记录中,而不是一个记录。1联络观察股3(例如)Recs to Partition4(例如)对片段
的记录同样,只使用一个提交到UnitOfWork,提交将被放置到ObservationUnit(它是所有其余的聚合)。任何失败都应该删除任何插入。
帮忙吗?由于人
如果您的UnitOfWork/存储库支持事务,这应该是相当直接的。因为NHibernates ISession已经是一个UnitOfWork,我在我的例子中使用它:
using(var session = OpenSession())
using(var tx = session.BeginTransaction())
{
var observationUnit = new ObserVationUnit{ /* fill it */};
var partition = new Partition { ObservationUnit = observationUnit, /* fill the rest */ };
var fragment = new Fragment { Partition = partition, /* fill the rest */ };
session.Save(observationUnit);
session.Save(partition);
session.Save(fragment);
tx.Commit();
}
只能保存片段