Я хочу отобразить класс, который имеет свойство типа 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; }
}
Есть идеи?
Это не сработает. NHibernate требует, чтобы все столбцы наборов коллекций компонентов были не-null. Ссылка: http://nhforge.org/doc/nh/en/index.html#components-incollections – cremor
не совсем верно. Только для отображения «Set» все столбцы должны быть не-null. И я пропустил это в требованиях, чтобы имя было нулевым. Переключиться на сумку или список, если требуется значение NULL – Firo