2012-03-07 1 views
0

Я пытаюсь создать родительский объект (Policy) с двумя дочерними сущностями (ExpressionRules и ThresholdRules), где типы дочерних объектов одинаковы и существуют в одной таблице. Например:NHibernate: Сопоставьте две коллекции на одну таблицу?

class Policy 
{ 
    ICollection<Rule> ExpressionRules { get; set; } 
    ICollection<Rule> ThresholdRules { get; set; } 
} 

class Rule 
{ 
    public virtual int SequenceNumber { get; set; } 
    public virtual ICondition Condition { get; set; } 
} 

interface ICondition 
{ 
} 

class ExpressionCondition : ICondition 
{ 
    public virtual string Expression { get; set; } 
} 

class ThresholdCondition : ICondition 
{ 
    public virtual int Threshold { get; set; } 
} 

На практике каждый набор правил будет иметь в себе различные исполнители ICondition. Отображения ICondition имеют дискриминаторы, согласно которым загружается правильная реализация. Но правила в двух наборах идентичны, и я бы хотел, чтобы они отображались в одну и ту же таблицу.

Возможно ли это?

(Если добавить примеры картографирования, пожалуйста, используйте XML-отображения, если это возможно.)

+0

Можете ли вы включить пример реализации? NHibernate не отображает через интерфейсы, поэтому трудно дать советы без конкретных примеров того, что вы пытаетесь сделать. – Fourth

+0

Я добавил несколько бетонов, которые более похожи на пример реального мира, который я пытаюсь решить. Надеюсь, что это станет более ясным. – joniba

ответ

1

Похоже, вы просто хотите один набор детей и детей, вы должны иметь базовый класс (называемый внучат), который может получить дискриминации. Что-то вроде:

class Parent 
{ 
    ICollection<Child> Children { get; } 
} 

class Child 
{ 
    public virtual bool SomeFlag { get; set; } 
    public virtual GrandChild GrandChild { get; set; } 
} 

class GrandChild{} 

class GrandChild1 : GrandChild 
{ 
    public virtual string SomeProperty { get; set; } 
} 

class GrandChild2 : GrandChild 
{ 
    public virtual int SomeOtherProperty { get; set; } 
} 
+0

На самом деле мне действительно нужны два совершенно разных набора, так как на уровне бизнеса они используются по-разному. Но я думаю, что могу сделать, как вы предлагаете, и фильтровать в моем коде. Это просто означает много кода фильтрации, усеянного моей родительской сущностью. – joniba

+0

Thats бизнес-логика, которую вы пытаетесь принудить к nhibernate - nhibernate должен просто увлажнять данные, а затем родитель должен иметь логику, чтобы вернуть «ребенка с этими великими детьми» или что-то еще. – Fourth

+0

Да, это то, что я сделал в конце. – joniba