Nhibernate - Наследование - От нуля до одного Отношение к дочернему объекту, как отобразить? (Свободный API) - PullRequest
0 голосов
/ 30 ноября 2011

У меня есть иерархия наследования, где Action является родителем ActionCompleted и ActionCancelled. Класс заказа содержит ноль к одному ActionCompleted и ActionCancelled.

единственное место, где я хотел сохранить внешний ключ, находится в таблице действий orderId. это возможно? Это прекрасно работает в реляционном мире? Там может быть 7-8 ActionTypes и порядок будет иметь отношение ко всем из них от нуля до одного.

Я новичок в ORM и начал с EF, но до сих пор не получил никакой помощи для решения этой проблемы, теперь я хочу исследовать это с помощью NHibernate. Я знаю, что это может быть слишком много, чтобы спросить, но если у кого-то есть свободное время и может написать мне сопоставления для сценария ниже, это будет оценено. Если вы можете указать мне на пример, который использует похожий сценарий, это также очень поможет. Поскольку я только начинаю работать с Nhibernate, для меня может оказаться слишком сложным заняться отображением наследования и сопоставлением с дочерним объектом.

Ниже приведена ссылка на код для классов и скрипт БД, пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Спасибо.

Entity Framework - Наследование - От нуля до одного Отношение к дочернему объекту, как сопоставить? (Свободный API)

http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/69d9145a-f7ec-4845-b01a-26e57e9ba16e?prof=required

1 Ответ

2 голосов
/ 30 ноября 2011
//Classes
public class Order
{
    public virtual int OrderId { get; set; }
    public virtual string Name { get; set; }
    public virtual ActionCompleted ACO { get; set; }
    public virtual ActionCancelled ACA { get; set; }

}

public class Action
{
    public virtual int ID { get; set; }
    public virtual DateTime ActionDT { get; set; }
    public virtual Order Order { get; set; }
}

public class ActionCompleted : Action
{

}
public class ActionCancelled : Action
{
    public Physician CancelledBy { get; set; }
}

// FluentNHibernate Mappings
public class OrderMap : ClassMap<Order>
{
    public OrderMap()
    {
        Id(x => x.OrderId);

        Map(x => x.Name);
        References(x => x.ACO, "ActionCompletedId");
        References(x => x.ACA, "ActionCanceledId");
    }
}

public class ActionMap : ClassMap<Action>
{
    public ActionMap()
    {
        Id(x => x.ActionID);
        DiscriminateSubclassOn("ActionType");   // if present TPH, otherwise TPC

        Map(x => x.ActionDT);
        References(x => x.Order, "DiagOrderId");
    }
}

public class ActionCompletedMap : SubclassMap<ActionCompleted>
{
    public ActionCompletedMap()
    {
        DiscrimitatorValue("Completed");
    }
}
public class ActionCancelledMap : SubclassMap<>
{
    public ActionCompletedMap()
    {
        DiscrimitatorValue("Completed");
        Refernces(x => x.CancelledBy, "CancelledByPhysician");
    }
}

// factory aka ObjectContext
ISessionFactory factory = Fluently.Configure()
    .DataBase(SqlServerConfiguration.Standard.Connectionstring(connstring))
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<OrderMap>())
    .BuildSessionFactory();

Обновление: обновление 2:

// FluentNHibernate Mappings
public class OrderMap : ClassMap<Order>
{
    public OrderMap()
    {
        Id(x => x.OrderId);

        Map(x => x.Name);

        Join("ActionTable", join => 
        {
            .KeyColumn("OrderId");
            join.Optional();
            join.Where("ActionType = 'ActionCompleted'");
            join.Component(x => x.ACO, c => 
            {
                c.Map(x => x.ActionID).Not.Insert();
                c.Map(x => x.ActionDT);
                c.ParentReference(x => x.Order);
            }
        }));
        Join("ActionTable", join =>
        {
            join.KeyColumn("OrderId");
            join.Optional();
            join.Where("ActionType = 'ActionCanceled'");
            join.Component(x => x.ACA, c => 
            {
                c.Map(x => x.ActionID).Not.Insert();
                c.Map(x => x.ActionDT);
                c.ParentReference(x => x.Order);
                c.Map(x => x.CanceledBy);
            }
        }));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...