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())
;
片段的映射代码(它是继承类型Mapping):
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")
;
大家好,
我想知道是否有任何方法可以使用上述映射到FNH表格之间放置下面提到的2个场景&#34; ObservationUnit&#34; - &#34; Partition&#34; - &#34; Fragment& #34 ;.
场景1: 有争议地向所有人插入一条记录。 1回到观察单位 1 Rec to Partition 1 Rec to Fragment
仅对UnitOfWork使用一次提交(它实现了存储库模式) 提交将被置于ObservationUnit(其余部分为Aggregate)。 例如:如果提交失败(ObservationUnit实体没有记录),则应放置回滚以避免分区和片段表之间的任何持久更改。
场景2: 有意识地插入所有人更多的记录。 1回到观察单位 3(例如)Recs to Partition 4(例如)Recs to Fragment
同样,在UnitOfWork中只使用一次提交,提交将被置于ObservationUnit(其余部分为Aggregate)。任何失败都应该删除任何插入。
有任何帮助吗? 谢谢你们
答案 0 :(得分:0)
如果您的UnitOfWork / repository支持事务,这应该是相当直接的。 由于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();
}
只保存片段也可以。