Nhibernate - 2 - 主要细节级别 - 插入一个UnitOfWork

时间:2014-08-19 20:35:31

标签: nhibernate aggregate unit-of-work master-detail

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)。任何失败都应该删除任何插入。

有任何帮助吗? 谢谢你们

1 个答案:

答案 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();
}

只保存片段也可以。