2013-05-12 1 views
0

Я хочу отобразить класс, который имеет свойство типа ICollection<> с использованием сопоставления NHibernate по коду. Ниже приведен код. Но мне не нравится дополнительная собственность Person в пределах CarSet, чтобы сделать картографирование.Отображение по коду класса, имеющего свойство типа ICollection <>

public class PersonSet 
    {   
     public virtual int Id { get; set; } 
     public virtual string Name { get; set; } 
     public virtual ICollection<CarSet> Cars { get; set; } 
    } 

    public class CarSet 
    { 
     public virtual int Id { get; set; } 
     public virtual string Name { get; set; } 
     public virtual PersonSet Person { get; set; } 
    } 


    public class PersonSetMap : ClassMapping<PersonSet> 
    { 
     public PersonSetMap() 
     { 
      Id(x => x.Id, m=>m.Generator(Generators.Identity)); 
      Property(x=>x.Name); 
      Set(x => x.Cars, c => 
       { 
        c.Key(k => 
         { 
          k.Column("PersonId"); 
         }); 
        c.Cascade(Cascade.Persist); 
        c.Lazy(CollectionLazy.NoLazy); 
       }, r => 
        { 
         r.OneToMany(); 
        } 
       ); 
     } 
    } 

    public class CarSetMap : ClassMapping<CarSet> 
    { 
     public CarSetMap() 
     { 
      Id(x => x.Id, m => m.Generator(Generators.Identity)); 
      Property(x => x.Name); 
      ManyToOne(x => x.Person, m => 
      { 
       m.Column("PersonId"); 
       m.Cascade(Cascade.None); 
       m.NotNullable(true); 
      }); 

     } 
    } 

     public void Save(){ 

     using (var session = Cfg.Session) 
      using (var tx = session.BeginTransaction()) 
      { 
       PersonSet John = new PersonSet { Name = PersonName.John }; 
       John.Cars = new List<CarSet> { 
       new CarSet { Name = CarnName.BMW,Person = John}, 
        new CarSet { Name = CarnName.BM,Person = John }}; 
       session.Save(entity); 
       tx.Commit(); 
      } 

    } 

Код выше генерирует SQL скрипт ниже:

create table PersonSet (
     Id INT IDENTITY NOT NULL, 
    Name NVARCHAR(255) null, 
    primary key (Id) 
) 

    create table CarSet (
     Id INT IDENTITY NOT NULL, 
    Name NVARCHAR(255) null, 
    PersonId INT not null, 
    primary key (id) 
) 

    alter table CarSet 
     add constraint FKF967D6489A220265 
     foreign key (PersonId) 
     references PersonSet 

То, что я хочу, чтобы генерировать SQL скрипт с перепадом показано ниже, и держать остальное то же самое:

create table CarSet (  
    Name NVARCHAR(255) null, 
    PersonId INT not null, 

) 

В идеале Я хочу вместо этого CarSet:

public class CarSet 
{ 
    public virtual int PersonId { get; set; } 
    public virtual string Name { get; set; } 

} 

Есть идеи?

ответ

0

карта Автомобили в ComponentCollection

class Person 
{ 

    public int Id { get; set; } 
    public string Name { get; set; } 
    public ICollection<Car> Cars { get; set; } 
} 

class Car 
{ 
    public virtual Person Owner { get; set; } 
    public virtual string Name { get; set; } 
} 

public class PersonMap : ClassMapping<Person> 
{ 
    public PersonMap() 
    { 
     Id(x => x.Id, m => m.Generator(Generators.Identity)); 
     Property(x => x.Name); 
     Set(x => x.Cars, c => 
     { 
      c.Key(k => k.Column("PersonId")); 
      c.Cascade(NHibernate.Mapping.ByCode.Cascade.Persist); 
      c.Lazy(CollectionLazy.NoLazy); 
     }, r => 
     { 
      r.Component(c => 
      { 
       c.Parent(x => x.Owner); 
       c.Property(x => x.Name); 
      }); 
     }); 
    } 
} 
+0

Это не сработает. NHibernate требует, чтобы все столбцы наборов коллекций компонентов были не-null. Ссылка: http://nhforge.org/doc/nh/en/index.html#components-incollections – cremor

+0

не совсем верно. Только для отображения «Set» все столбцы должны быть не-null. И я пропустил это в требованиях, чтобы имя было нулевым. Переключиться на сумку или список, если требуется значение NULL – Firo

0

Ваше идеальное решение не представляется возможным. Чтобы использовать таблицу CarSet без собственного столбца идентификатора, он должен быть компонентом, но наборы компонентов не могут иметь нулевых столбцов. Если вам нормально пометить Name как not-null, вы можете адаптировать решение Firo.

Если это не нормально, вы можете, по крайней мере, решить свой первый запрос, чтобы удалить свойство Person. Просто удалите свойство и пометьте столбец ключей в своем наборе сопоставлений как не-nullable. CarSet все равно будет сущностью (и, следовательно, имеет собственный идентификатор), но вам не нужна ссылка на код PersonSet.

Btw, почему ваши классы добавлены Set? Просто называть их Person и Car было бы намного лучше, поскольку они представляют только одного человека или машину, а не их коллекцию.