Nhibernate - 2 - Master Details -在一个UnitOfWork中插入



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

只能保存片段

相关内容

最新更新