Does anybody have any views on this? I just would like to know if I can expect this to be a future feature or if I will need to keep patching future versions?
On Oct 31, 5:00 pm, Dries Samyn <dries.sa...@googlemail.com> wrote: > I have been playing around with Fluent for a while now, and have been > trying to build a convention that echos how I usually write mapping > files. > > One thing I was missing was good support for using Interfaces as > proxies, and generally in the model. > I was pleased to see the "Proxy" patch on ClassInstance, but one thing > that I think was also missing is to be able to set/override the > standard class mapping on a one-to-many mapping. > I'll try to explain. > I usually like to model my collections in my objects like this: > (pseudo code) > > public class AutomapProduct : IAutomapProduct > { > protected IList<IProductAttribute> _attributes = new > List<IProductAttribute>(); > > public IEnumerable<IProductAttribute> Attributes > { > get { return _attributes; } > protected set { _attributes = > value.ToList<IProductAttribute>(); }//only here for fluent nh > } > > } > > So the collection is declared with IProductAttribute instead of > ProductAttribute. > Obviously, when mapping this, one has to map this to a concrete type. > I know some people consider the above an anti-pattern, but here's not > the place to discuss this, the above is possible in nHibernate, and > it's now possible in Fluent too by using: > > HasMany<ProductAttribute>(x => x.Attributes); > > However, I don't think it was possible before to set up a convention > that, by default, would try to map it to a concrete type based on the > interface's name. > > For this, I added a SetManyClass method on OneToManyInstance to allow > this to be set in a convention. > This allows me to do something like: > > public class HasManyConvetion : IHasManyConvention > { > > public void Apply(IOneToManyCollectionInstance instance) > { > //collection may be declared to return interface -> > default to obvious candidate for mapping. > if (instance.Relationship.ManyClass.GetUnderlyingSystemType > ().IsInterface) > { > string name = > instance.Relationship.ManyClass.Name.Substring(1);//remove I > string namesp = > instance.Relationship.ManyClass.GetUnderlyingSystemType().Namespace; > string assem = > instance.Relationship.ManyClass.GetUnderlyingSystemType > ().Assembly.ToString(); > instance.Relationship.SetManyClass(Type.GetType > (string.Concat(namesp, ".", name, ", ", assem))); > } > } > } > > Again, I don't really want to discuss the pattern here, I personally > like to use interfaces in collections, but here's not the place to > discuss this pattern, I just want to discuss the Fluent implementation > and conventions ;) > > The patch to implement this is is below. > > Is this useful? Is it worth adding? > > -- > Index: Conventions/Instances/IOneToManyInstance.cs > =================================================================== > --- Conventions/Instances/IOneToManyInstance.cs (revision 647) > +++ Conventions/Instances/IOneToManyInstance.cs (working copy) > @@ -1,9 +1,17 @@ > using FluentNHibernate.Conventions.Inspections; > +using System; > +using FluentNHibernate.MappingModel; > > namespace FluentNHibernate.Conventions.Instances > { > public interface IOneToManyInstance : IOneToManyInspector, > IRelationshipInstance > { > INotFoundInstance NotFound { get; } > + > + TypeReference ManyClass { get; } > + > + void SetManyClass<T>(); > + void SetManyClass(Type type); > + void SetManyClass(string type); > } > } > \ No newline at end of file > Index: Conventions/Instances/OneToManyInstance.cs > =================================================================== > --- Conventions/Instances/OneToManyInstance.cs (revision 647) > +++ Conventions/Instances/OneToManyInstance.cs (working copy) > @@ -1,5 +1,7 @@ > using FluentNHibernate.Conventions.Inspections; > using FluentNHibernate.MappingModel.Collections; > +using System; > +using FluentNHibernate.MappingModel; > > namespace FluentNHibernate.Conventions.Instances > { > @@ -24,5 +26,28 @@ > }); > } > } > + > + public TypeReference ManyClass > + { > + get > + { > + return mapping.Class; > + } > + } > + > + public void SetManyClass<T>() > + { > + SetManyClass(typeof(T)); > + } > + public void SetManyClass(Type type) > + { > + if(!mapping.IsSpecified("class")) > + mapping.Class = new TypeReference(type); > + } > + public void SetManyClass(string type) > + { > + if(!mapping.IsSpecified("class")) > + mapping.Class = new TypeReference(type); > + } > } > } > \ No newline at end of file --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Fluent NHibernate" group. To post to this group, send email to fluent-nhibernate@googlegroups.com To unsubscribe from this group, send email to fluent-nhibernate+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/fluent-nhibernate?hl=en -~----------~----~----~----~------~----~------~--~---