Mert
Mert

Reputation: 6582

mapping interface with automap

I couldn't make interface mapping work, anyidea how to do this?

public class Event 
{
    public virtual int EventId { get; set; }
    public virtual string Name { get; set; }
    public virtual ENEventNodeType EventType { get; set; }
    public virtual IEventNode EventNode { get; set; }
}

public interface IEventNode {}

public enum ENEventNodeType : short
{
    [Description("Mission")]
    Mission = 1,
    [Description("Task")]
    Task = 2,
    [Description("Quiz")]
    Quiz = 3
}

public class Mission : IEventNode
{
    public virtual int MissionId { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Event> EventList { get; set; }   
}

public class Task : IEventNode
{
    public virtual int TaskId { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Event> EventList { get; set; }    
}

Why I am doing this: IEventNode could be 20+ different class and Event can have only one. so other 19+ fields will be always null. I was trying to set Id on same field and EventNodeType shows which class's id is in the field. alternatives welcomed

SOLUTION 1) AutoMappingOverride

public class EventMappingOverride : IAutoMappingOverride<Event>
{
    public void Override(AutoMapping<Event> mapping)
    {
        var any = mapping.ReferencesAny(x => x.EventNode)
            .EntityIdentifierColumn("EventNodeId")
            .EntityTypeColumn("EventType")
            .IdentityType<int>()
            .MetaType<int>();

        foreach (var eventNodeType in typeof(Event).Assembly.GetExportedTypes().Where(typeof(IEventNode).IsAssignableFrom))
        {
            if (!eventNodeType.IsInterface && !eventNodeType.IsAbstract)
                any.AddMetaValue(eventNodeType, eventNodeType.Name);
        }
    }
}

Upvotes: 0

Views: 503

Answers (1)

Firo
Firo

Reputation: 30813

public class Event
{
    public virtual int EventId { get; set; }
    public virtual string Name { get; set; }
    public virtual IEventNode EventNode { get; set; }
}

public interface IEventNode { }

// example using FluentNHibernate Mapping
public class EventMap : ClassMap<Event>
{
    public EventMap()
    {
        Id(x => x.EventId);

        Map(x => x.Name);
        var any = ReferencesAny(x => x.EventNode)
            .EntityIdentifierColumn("eventNode_id")
            .EntityTypeColumn("EventType")
            .IdentityType<int>()
            .MetaType<int>();

        foreach (var eventNodeType in   typeof(Event).Assembly.GetExportedTypes().Where(typeof(IEventNode).IsAssignableFrom))
        {
            if (!eventNodeType.IsInterface && !eventNodeType.IsAbstract)
                any.AddMetaValue(eventNodeType, eventNodeType.Name);
        }
    }
}

then do

if (event.EventNode is Mission)
    Write("Hey its a mission");
...

Upvotes: 1

Related Questions