Reputation: 6582
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
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