private static void MapList <TParent, TElement>(IClassMapper <TParent> rc, Expression <Func <TParent, IEnumerable <TElement> > > expression, CollectionFetchMode fetchMode = null, Action <IBagPropertiesMapper <TParent, TElement> > mapper = null) where TParent : class { rc.Bag( expression, m => { m.Key( km => { km.Column( ckm => { ckm.Name("ParentId"); }); km.ForeignKey("none"); }); m.Cascade(Mapping.ByCode.Cascade.All); if (fetchMode != null) { m.Fetch(fetchMode); } mapper?.Invoke(m); }, a => a.OneToMany()); }
void DetailCollectionCustomization(IClassMapper <DetailCollection> ca) { ca.Table(tablePrefix + "DetailCollection"); ca.Lazy(false); ca.Cache(cm => { cm.Usage(CacheUsage.NonstrictReadWrite); cm.Region(cacheRegion); }); ca.Id(x => x.ID, cm => { cm.Generator(Generators.Native); }); ca.ManyToOne(x => x.EnclosingItem, cm => { cm.Column("ItemID"); cm.Fetch(FetchKind.Select); cm.Lazy(LazyRelation.Proxy); }); ca.Property(x => x.Name, cm => { cm.Length(50); cm.NotNullable(true); }); ca.Bag(x => x.Details, cm => { cm.Key(k => k.Column("DetailCollectionID")); cm.Inverse(true); cm.Cascade(Cascade.All | Cascade.DeleteOrphans); cm.Lazy(CollectionLazy.Lazy); cm.Fetch(CollectionFetchMode.Select); cm.Cache(m => { m.Usage(CacheUsage.NonstrictReadWrite); m.Region(cacheRegion); }); }, cr => cr.OneToMany()); }
/// <summary> /// ManyToMany设置 /// </summary> /// <typeparam name="X">Entity类型泛型</typeparam> /// <typeparam name="T">参数类型泛型</typeparam> /// <param name="inputValue">输入的Mapper</param> /// <param name="inputBag">输入的表达式参数</param> private static void BagManyToMany <X, T>(IClassMapper <X> inputValue, Expression <Func <X, IEnumerable <T> > > inputBag, bool ifInVerse) where X : BaseEntity { var useThisType = typeof(X); var useAnotherType = typeof(T); bool useifInVerse = ifInVerse; //利用Hash值进行计算 if (useThisType.GetHashCode() < useAnotherType.GetHashCode()) { useifInVerse = false; } else if (useThisType.GetHashCode() > useAnotherType.GetHashCode()) { useifInVerse = true; } inputValue.Bag <T>(inputBag, bag => { bag.Key(c => c.Column(useThisType.Name)); bag.Cascade(Cascade.All); bag.Inverse(useifInVerse); bag.Cache(k => k.Usage(CacheUsage.ReadWrite)); }, mapper => mapper.ManyToMany(c => c.Column(useAnotherType.Name))); }
void DetailCollectionCustomization(IClassMapper<DetailCollection> ca) { ca.Table(tablePrefix + "DetailCollection"); ca.Lazy(false); ca.Cache(cm => { cm.Usage(CacheUsage.NonstrictReadWrite); cm.Region(cacheRegion); }); ca.Id(x => x.ID, cm => { cm.Generator(Generators.Native); }); ca.ManyToOne(x => x.EnclosingItem, cm => { cm.Column("ItemID"); cm.Fetch(FetchKind.Select); cm.Lazy(LazyRelation.Proxy); }); ca.Property(x => x.Name, cm => { cm.Length(50); cm.NotNullable(true); }); ca.Bag(x => x.Details, cm => { cm.Key(k => k.Column("DetailCollectionID")); cm.Inverse(true); cm.Cascade(Cascade.All | Cascade.DeleteOrphans); cm.Lazy(CollectionLazy.Lazy); cm.Fetch(CollectionFetchMode.Select); cm.Cache(m => { m.Usage(CacheUsage.NonstrictReadWrite); m.Region(cacheRegion); }); }, cr => cr.OneToMany()); }
void ContentItemCustomization(IClassMapper<ContentItem> ca) { ca.Table(tablePrefix + "Item"); ca.Lazy(false); ca.Cache(cm => { cm.Usage(CacheUsage.NonstrictReadWrite); cm.Region(cacheRegion); }); ca.Id(x => x.ID, cm => { cm.Generator(Generators.Native); }); ca.Discriminator(cm => { cm.Column("Type"); cm.Type(NHibernateUtil.String); }); ca.Property(x => x.Created, cm => { }); ca.Property(x => x.Published, cm => { }); ca.Property(x => x.Updated, cm => { }); ca.Property(x => x.Expires, cm => { }); ca.Property(x => x.Name, cm => { cm.Length(250); }); ca.Property(x => x.ZoneName, cm => { cm.Length(50); }); ca.Property(x => x.TemplateKey, cm => { cm.Length(50); }); ca.Property(x => x.TranslationKey, cm => { }); ca.Property(x => x.Title, cm => { cm.Length(250); }); ca.Property(x => x.SortOrder, cm => { }); ca.Property(x => x.Visible, cm => { }); ca.Property(x => x.SavedBy, cm => { cm.Length(50); }); ca.Property(x => x.State, cm => { }); ca.Property(x => x.ChildState, cm => { }); ca.Property(x => x.AncestralTrail, cm => { cm.Length(100); }); ca.Property(x => x.VersionIndex, cm => { }); ca.Property(x => x.AlteredPermissions, cm => { }); //ca.ManyToOne(x => x.VersionOf, cm => { cm.Column("VersionOfID"); cm.Lazy(LazyRelation.Proxy); cm.Fetch(FetchKind.Select); }); //ca.Property(x => x.VersionOf, cm => //{ // cm.Column("VersionOfID"); // cm.Type<ContentRelationFactory>(); //}); ca.Component(x => x.VersionOf, cm => { cm.Property(cr => cr.ID, pm => pm.Column("VersionOfID")); }); ca.ManyToOne(x => x.Parent, cm => { cm.Column("ParentID"); cm.Lazy(LazyRelation.Proxy); cm.Fetch(FetchKind.Select); }); ca.Bag(x => x.Children, cm => { cm.Key(k => k.Column("ParentID")); cm.Inverse(true); cm.Type<ContentItemListFactory<ContentItem>>(); cm.Cascade(childrenCascade); cm.OrderBy(ci => ci.SortOrder); cm.Lazy(childrenLaziness); if (childrenBatch) cm.BatchSize(batchSize ?? 10); cm.Cache(m => { m.Usage(CacheUsage.NonstrictReadWrite); m.Region(cacheRegion); }); }, cr => cr.OneToMany()); ca.Bag(x => x.Details, cm => { cm.Key(k => k.Column("ItemID")); cm.Inverse(true); cm.Type<ContentListFactory<ContentDetail>>(); cm.Cascade(Cascade.All | Cascade.DeleteOrphans); cm.Fetch(CollectionFetchMode.Select); cm.Lazy(CollectionLazy.Lazy); cm.BatchSize(batchSize ?? 10); cm.Cache(m => { m.Usage(CacheUsage.NonstrictReadWrite); m.Region(cacheRegion); }); cm.Where("DetailCollectionID IS NULL"); }, cr => cr.OneToMany()); ca.Bag(x => x.DetailCollections, cm => { cm.Key(k => k.Column("ItemID")); cm.Inverse(true); cm.Type<ContentListFactory<DetailCollection>>(); cm.Cascade(Cascade.All | Cascade.DeleteOrphans); cm.Fetch(CollectionFetchMode.Select); cm.Lazy(CollectionLazy.Lazy); cm.BatchSize(batchSize ?? 10); cm.Cache(m => { m.Usage(CacheUsage.NonstrictReadWrite); m.Region(cacheRegion); }); }, cr => cr.OneToMany()); ca.Bag(x => x.AuthorizedRoles, cm => { cm.Key(k => k.Column("ItemID")); cm.Inverse(true); cm.Cascade(Cascade.All | Cascade.DeleteOrphans); cm.Fetch(CollectionFetchMode.Select); cm.Lazy(CollectionLazy.Lazy); cm.BatchSize(batchSize ?? 25); cm.Cache(m => { m.Usage(CacheUsage.NonstrictReadWrite); m.Region(cacheRegion); }); }, cr => cr.OneToMany()); }
void ContentItemCustomization(IClassMapper <ContentItem> ca) { ca.Table(tablePrefix + "Item"); ca.Lazy(false); ca.Cache(cm => { cm.Usage(CacheUsage.NonstrictReadWrite); cm.Region(cacheRegion); }); ca.Id(x => x.ID, cm => { cm.Generator(Generators.Native); }); ca.Discriminator(cm => { cm.Column("Type"); cm.Type(NHibernateUtil.String); }); ca.Property(x => x.Created, cm => { }); ca.Property(x => x.Published, cm => { }); ca.Property(x => x.Updated, cm => { }); ca.Property(x => x.Expires, cm => { }); ca.Property(x => x.Name, cm => { cm.Length(250); }); ca.Property(x => x.ZoneName, cm => { cm.Length(50); }); ca.Property(x => x.TemplateKey, cm => { cm.Length(50); }); ca.Property(x => x.TranslationKey, cm => { }); ca.Property(x => x.Title, cm => { cm.Length(250); }); ca.Property(x => x.SortOrder, cm => { }); ca.Property(x => x.Visible, cm => { }); ca.Property(x => x.SavedBy, cm => { cm.Length(50); }); ca.Property(x => x.State, cm => { }); ca.Property(x => x.ChildState, cm => { }); ca.Property(x => x.AncestralTrail, cm => { cm.Length(100); }); ca.Property(x => x.VersionIndex, cm => { }); ca.Property(x => x.AlteredPermissions, cm => { }); //ca.ManyToOne(x => x.VersionOf, cm => { cm.Column("VersionOfID"); cm.Lazy(LazyRelation.Proxy); cm.Fetch(FetchKind.Select); }); //ca.Property(x => x.VersionOf, cm => //{ // cm.Column("VersionOfID"); // cm.Type<ContentRelationFactory>(); //}); ca.Component(x => x.VersionOf, cm => { cm.Property(cr => cr.ID, pm => pm.Column("VersionOfID")); }); ca.ManyToOne(x => x.Parent, cm => { cm.Column("ParentID"); cm.Lazy(LazyRelation.Proxy); cm.Fetch(FetchKind.Select); }); ca.Bag(x => x.Children, cm => { cm.Key(k => k.Column("ParentID")); cm.Inverse(true); cm.Type <ContentItemListFactory <ContentItem> >(); cm.Cascade(childrenCascade); cm.OrderBy(ci => ci.SortOrder); cm.Lazy(childrenLaziness); if (childrenBatch) { cm.BatchSize(batchSize ?? 10); } cm.Cache(m => { m.Usage(CacheUsage.NonstrictReadWrite); m.Region(cacheRegion); }); }, cr => cr.OneToMany()); ca.Bag(x => x.Details, cm => { cm.Key(k => k.Column("ItemID")); cm.Inverse(true); cm.Type <ContentListFactory <ContentDetail> >(); cm.Cascade(Cascade.All | Cascade.DeleteOrphans); cm.Fetch(CollectionFetchMode.Select); cm.Lazy(CollectionLazy.Lazy); cm.BatchSize(batchSize ?? 10); cm.Cache(m => { m.Usage(CacheUsage.NonstrictReadWrite); m.Region(cacheRegion); }); cm.Where("DetailCollectionID IS NULL"); }, cr => cr.OneToMany()); ca.Bag(x => x.DetailCollections, cm => { cm.Key(k => k.Column("ItemID")); cm.Inverse(true); cm.Type <DetailCollectionFactory>(); cm.Cascade(Cascade.All | Cascade.DeleteOrphans); cm.Fetch(CollectionFetchMode.Select); cm.Lazy(CollectionLazy.Lazy); cm.BatchSize(batchSize ?? 10); cm.Cache(m => { m.Usage(CacheUsage.NonstrictReadWrite); m.Region(cacheRegion); }); }, cr => cr.OneToMany()); ca.Bag(x => x.AuthorizedRoles, cm => { cm.Key(k => k.Column("ItemID")); cm.Inverse(true); cm.Cascade(Cascade.All | Cascade.DeleteOrphans); cm.Fetch(CollectionFetchMode.Select); cm.Lazy(CollectionLazy.Lazy); cm.BatchSize(batchSize ?? 25); cm.Cache(m => { m.Usage(CacheUsage.NonstrictReadWrite); m.Region(cacheRegion); }); }, cr => cr.OneToMany()); }
/// <summary> /// 代理执行Bag方法 (one - Many 对照) /// </summary> /// <typeparam name="X">Entity类型泛型</typeparam> /// <typeparam name="T">参数类型泛型</typeparam> /// <param name="inputValue">输入的Mapper</param> /// <param name="inputBag">输入的表达式参数</param> private static void Bag <X, T>(IClassMapper <X> inputValue, Expression <Func <X, IEnumerable <T> > > inputBag) where X : BaseEntity { inputValue.Bag <T>(inputBag, bag => { bag.Cascade(Cascade.All); bag.Inverse(true); bag.Cache(k => k.Usage(CacheUsage.ReadWrite)); }); }