diff --git a/src/Orchard.Web/Modules/Orchard.Tags/Models/ContentTagRecord.cs b/src/Orchard.Web/Modules/Orchard.Tags/Models/ContentTagRecord.cs index 5a7d1652e..af5b2bff3 100644 --- a/src/Orchard.Web/Modules/Orchard.Tags/Models/ContentTagRecord.cs +++ b/src/Orchard.Web/Modules/Orchard.Tags/Models/ContentTagRecord.cs @@ -1,7 +1,12 @@ +using Orchard.Data.Conventions; + namespace Orchard.Tags.Models { public class ContentTagRecord { public virtual int Id { get; set; } + + [Aggregate] public virtual TagRecord TagRecord { get; set; } + public virtual TagsPartRecord TagsPartRecord { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Tags/Models/TagsPartRecord.cs b/src/Orchard.Web/Modules/Orchard.Tags/Models/TagsPartRecord.cs index 4687757be..19aabe193 100644 --- a/src/Orchard.Web/Modules/Orchard.Tags/Models/TagsPartRecord.cs +++ b/src/Orchard.Web/Modules/Orchard.Tags/Models/TagsPartRecord.cs @@ -1,11 +1,14 @@ using System.Collections.Generic; using Orchard.ContentManagement.Records; +using Orchard.Data.Conventions; namespace Orchard.Tags.Models { public class TagsPartRecord : ContentPartRecord { public TagsPartRecord() { Tags = new List(); } + + [Aggregate] public virtual IList Tags { get; set; } } } \ No newline at end of file diff --git a/src/Orchard/Data/Conventions/AggregateAttribute.cs b/src/Orchard/Data/Conventions/AggregateAttribute.cs new file mode 100644 index 000000000..5747b6fa0 --- /dev/null +++ b/src/Orchard/Data/Conventions/AggregateAttribute.cs @@ -0,0 +1,40 @@ +using System; +using FluentNHibernate.Conventions; +using FluentNHibernate.Conventions.AcceptanceCriteria; +using FluentNHibernate.Conventions.Inspections; +using FluentNHibernate.Conventions.Instances; + +namespace Orchard.Data.Conventions +{ + /// + /// This attribute is used to mark relationships which need to be eagerly fetched with the parent object, + /// thus defining an aggregate in terms of DDD + /// + public class AggregateAttribute : Attribute + { + } + + public class ReferenceConvention : IReferenceConvention, IReferenceConventionAcceptance, IHasManyConvention, IHasManyConventionAcceptance + { + public void Apply(IManyToOneInstance instance) + { + instance.Fetch.Join(); + } + + public void Accept(IAcceptanceCriteria criteria) + { + criteria.Expect(x => x.Property != null && x.Property.IsDefined(typeof(AggregateAttribute), false)); + } + + public void Apply(IOneToManyCollectionInstance instance) + { + instance.Fetch.Join(); + } + + public void Accept(IAcceptanceCriteria criteria) + { + criteria.Expect(x => x.Member != null && x.Member.IsDefined(typeof(AggregateAttribute), false)); + } + } +} + diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index b15730e53..f33f28740 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -177,6 +177,7 @@ +