Just to add to the problems with joined subclasses, it seems that it's 
impossible to use AutoMappingTester<T> on a class that is subclass-mapped. FNH 
at least throws the following exception in my face:  

 System.InvalidOperationException : Could not find mapping for class 'Subclass'
 at 
FluentNHibernate.Testing.DomainModel.Mapping.MappingTester`1.ForMapping(ClassMap`1
 classMap) in 
fluent-nhibernate\src\FluentNHibernate.Testing\DomainModel\Mapping\MappingTester.cs:
 line 73
 at 
FluentNHibernate.Testing.Automapping.AutoMappingTester`1..ctor(AutoPersistenceModel
 mapper) in 
fluent-nhibernate\src\FluentNHibernate.Testing\AutoMapping\AutoMappingTester.cs:
 line 16


:-(

--  
Asbjørn Ulsberg  -=|=- [email protected] (mailto:[email protected])
«He's a loathsome offensive brute, yet I can't look away»

On onsdag 28. september 2011 at 17:19, Asbjørn Ulsberg wrote:

>  Thanks for your insights!  
>  
> The things I'm mapping is the Id and foreign key. I've hacked my way around 
> all of this by implementing IJoinedSubclassConvention like this:
>  
> public class JoinedSubclassConvention : IJoinedSubclassConvention
> {
> private static readonly IList<ClassMapping> joinedSubclasses;
>  
>  
> static JoinedSubclassConvention()
> {
> joinedSubclasses = new List<ClassMapping>();
> }
>  
>  
> public static void Add<T>(AutoMapping<T> mapping)
> {
> ClassMapping classMapping = ((IMappingProvider)mapping).GetClassMapping();
> joinedSubclasses.Add(classMapping);
> }
>  
>  
> public void Apply(IJoinedSubclassInstance instance)
> {
> string id = joinedSubclasses
> .Where(mapping => mapping.Type == instance.EntityType)
> .Select(mapping => mapping.Id).OfType<ColumnBasedMappingBase>()
> .SelectMany(mapping => mapping.Columns)
> .Where(column => column.Name != null && column.Name.EndsWith("Id"))
> .Select(idColumn => idColumn.Name)
> .FirstOrDefault();
>  
> if (id != null)
> {
> instance.Key.Column(id);
> instance.Key.ForeignKey(String.Format("FK_{0}_{1}", instance.EntityType.Name, 
> id));
> }
>  
> if (instance.EntityType.IsAbstract)
> instance.Abstract();
> }
> }
>  
>  
> And then in all IAutoMappingOverride implementations, I do this:
>  
> public void Override(AutoMapping<X> mapping)
> {
>  // Do the mapping
> JoinedSubclassConvention.Add(mapping);
> }
>  
>  
> It's lots of things that can be done in IAutoMappingOverride that isn't taken 
> into consideration in my JoinedSubclassConvention, but this works for Id and 
> foreign keys at least. I would love if this part of FNH could get some love 
> in the future and I would be more than happy to test anything that improves 
> on how this works at the moment.
>  
> Just being able to more easily figure out what an IAutoMappingOverride has 
> done, and be able to extract this would be awesome. Even more awesome would 
> be if IAutoMappingOverride would actually be useful for subclass-mapped 
> entities, so when calling mapping.Id(x => x.Id, "MyId"), the ID column is 
> named "MyId", etc.
>  
> --  
> Asbjørn Ulsberg  -=|=- [email protected] (mailto:[email protected])
> «He's a loathsome offensive brute, yet I can't look away»
>  
> On onsdag 28. september 2011 at 06:44, Isaac Cambron wrote:
>  
> > I looked into this for a while (original group post here 
> > (http://groups.google.com/group/fluent-nhibernate/browse_thread/thread/617eeaa8fb31935d/c0cd57536e7c642a?lnk=gst&q=isaac#c0cd57536e7c642a)).
> >  Basically, subclassing from an override doesn't work at all. I took a stab 
> > at fixing it (branch is here 
> > (https://github.com/icambron/fluent-nhibernate/tree/discriminate_in_overrides),
> >  though I'm not sure what state it's in), and wasn't able to make it work 
> > within the timebox I had for it. In fact, it turned out to be really 
> > complicated and probably the wrong approach, and I may have to start over. 
> > In fact, after attacking it from a few different angles, I'm not even sure 
> > it *should* be possible; the Subclass<> method deprecation is actually 
> > right, but in the meantime we don't have any other solution. But I'll 
> > probably have another go at it in case I missed something.
> >  
> > The specific error you're getting isn't hard to fix though, if I'm right 
> > about what it is. Basically, AutoSubClassPart only takes a string 
> > discriminator in the constructor for some reason, and the reflection code 
> > that tries to find it is failing. My branch has a fix for that here 
> > (https://github.com/icambron/fluent-nhibernate/commit/b94914453d87e2c3db014bfc371489a7e492344b#src/FluentNHibernate/Automapping/AutoSubClassPart.cs),
> >  and also some tests about it. OTOH, I suspect that if you pull out that 
> > fix, it will only get you to the next failure.  
> >  
> > TL;DR - mapping.Subclass<Child>(1, () => {}) is very broken.
> >  
> > -Isaac
> >  
> > On Tue, Sep 27, 2011 at 11:00 AM, James Gregory <[email protected] 
> > (mailto:[email protected])> wrote:
> > > Is it just foreign key naming you're doing, or more? Have you seen the 
> > > ForeignKeyConvention base class? You might be able to use that instead; 
> > > but either way, that class implements IJoinedSubclassConvention so it 
> > > might give you some ideas.
> > >  
> > > Documentation on this area is sparse; frankly, because it's crap.
> > >  
> > >  --  
> > >  You received this message because you are subscribed to the Google 
> > > Groups "Fluent NHibernate" group.
> > >  To view this discussion on the web visit 
> > > https://groups.google.com/d/msg/fluent-nhibernate/-/9H4Fa-MP1lwJ.
> > >  
> > >  To post to this group, send email to [email protected] 
> > > (mailto:[email protected]).
> > >  To unsubscribe from this group, send email to 
> > > [email protected] 
> > > (mailto:fluent-nhibernate%[email protected]).
> > >  For more options, visit this group at 
> > > http://groups.google.com/group/fluent-nhibernate?hl=en.
> >  
> >  --  
> >  You received this message because you are subscribed to the Google Groups 
> > "Fluent NHibernate" group.
> >  To post to this group, send email to [email protected] 
> > (mailto:[email protected]).
> >  To unsubscribe from this group, send email to 
> > [email protected] 
> > (mailto:[email protected]).
> >  For more options, visit this group at 
> > http://groups.google.com/group/fluent-nhibernate?hl=en.
>  

-- 
You received this message because you are subscribed to the Google Groups 
"Fluent NHibernate" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/fluent-nhibernate?hl=en.

Reply via email to