2015-01-17 4 views
2

У меня есть объект, который имеет много источников данных.nhibernate mapping по коду, объект сопоставления со списком объектов значений

public class MyData 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual IList<DataSource> Sources { get; set; } 
    public MyData(){ 
     Sources = new List<DataSource>(); 
    } 
} 

и у меня есть класс DataSource, который представляет объект ценностного MyData объекта

public class DataSource 
{ 
    public enum SourceEnum { dataOneSrc = 1, dataTwoSrc = 2} 
    public virtual SourceEnum Source { get; set; } 
    public virtual string InternalRefNr { get; set; } 
} 

Я использую NHibernate ОРМ и его отображение с помощью кода подхода. Итак, я сопоставил объект значения, используя эту ссылку, как ref. // http://lycog.com/programming/nhibernate-32-mapping-code-component-mapping/

public static Action<IComponentMapper<DataSource>> Mapping() 
{ 
    return c =>{ 
       c.Property(p => p.Source); 
       c.Property(p => p.InternalRefNr, m => 
       { 
        m.Length(255); 
       });      
      }; 
    } 

и отображение сущностей с использованием

public MyData() 
{ 
    ... 
    Bag<DataSource>(x => x.Sources, 
     c => { }, 
     r =>{ r.OneToMany();} 
    ); 
} 

Я получаю Nhibernate.MappingException

{ "Ассоциация ссылка некартированного класса: My.Model.DataSource"}

+0

Но не это исключение на самом деле Чисто? Вам просто нужно отобразить «DataSource».Вот так –

+0

Я сопоставил DataSource выше, public static Action > Сопоставление() – user1765862

+0

Вы можете отправить сообщение в качестве ответа, как бы вы могли сопоставить объект со списком объектов значений – user1765862

ответ

0

КОМПОЗИЦИОННЫЙ ЭЛЕМЕНТ

Если мы не хотим отображать отдельный объект, мы не можем использовать one-to-many. Нам нужно:

6.3. Collections of Values and Many-To-Many Associations (маленький процитировать)

Для набора значений, мы используем тег.

<element 
     column="column_name"    (1) 
     type="typename"      (2) 
/> 

...

Список компонентов (обсуждается в следующей главе):

<list name="CarComponents" table="car_components"> 
    <key column="car_id"/> 
    <index column="posn"/> 
    <composite-element class="Eg.Car.CarComponent"> 
      <property name="Price" type="float"/> 
      <property name="Type" type="Eg.Car.ComponentType, Eg"/> 
      <property name="SerialNumber" column="serial_no" type="String"/> 
    </composite-element> 
</list> 

Таким образом, в нашем случае, мы не можем использовать один-к -номен, но Component

// instead of this 
r =>{ r.OneToMany();} 
// we need this for IList<string> 
r.Element(e => { }); 
// this for DataSource as in the above question 
r.Component(c => { }); 

ONE-TO-МНОГО:

Отображение с помощью кода должно идти, как это: Hibernate's Mapping by Code. Любое лицо должно иметь суррогатный ключ (Id). Это должно быть DataSource:

public class DataSource 
{ 
    public virtual int Id { get; set; } 
    public virtual string InternalRefNr { get; set; } 
    public virtual MyDataMyData{ get; set; } 
} 

отображение этого класса, то может быть:

public class DataSourceMap : DataSourceMapping<DataSource> 
{ 
    public DataSourceMap() 
    { 
     Id(x => x.Id, m => m.Generator(Generators.Identity)); 
     Property(x => x.InternalRefNr); 
     ManyToOne(x => x.MyData); 
    } 
} 

И теперь мы можем отобразить MyData на основе Mapping-by-Code - Set and Bag

public MyData() 
{ 
    ... 
    Bag<DataSource>(x => x.Sources, 
     c => { c.Inverse(true); }, 
     r =>{ r.OneToMany();} 
    ); 
} 
+0

yep, но я не хочу, чтобы DataSource был сущностью. Он должен представлять объект ценности в этом контексте. – user1765862

+0

Хорошо, тогда вы должны ** НЕ использовать ** OneToMany - [6.3. Коллекции ценностей и ассоциаций «многие-ко-многим»] (http://nhforge.org/doc/nh/en/index.html#collections-ofvalues): * Для коллекции значений мы используем тег ''. * или * Список компонентов (обсуждается в следующей главе): '' * –

+0

Я продлил ответ со всеми подробностями. NHibernate может отображать 'IList ' с '', а также виртуальный объект с' <составным элементом> '... надеюсь, что это поможет –

Смежные вопросы