Какой код нужно перейти сюда:
,ConventionBuilder.HasMany.Always(x =>
x.Key.Column( /* what code need to go here? */ ))
Помимо этого ...
public virtual Person Owner { get; set; }
... to (идеально подходит только для новых систем):
public virtual Person Person { get; set; }
Как я могу предотвратить создание NHibernate постороннего Person_id при создании DDL?
Обратите внимание, что Person_id был создан NH (или FNH?), Даже если уже есть owner_ref, и обратите внимание на две ссылки:
create table contact (contact_id int4 not null,
number text, type text, owner_ref int4,
Person_id int4, primary key (contact_id));
create table person (person_id int4 not null, person_name text not null, birthdate timestamp not null, primary key (person_id));
alter table contact
add constraint FK38B7242018FA494F
foreign key (owner_ref) references person;
alter table contact
add constraint FK38B724202B329A0D
foreign key (Person_id) references person;
Я попробовал это просто для того, чтобы убедиться, что возможно предотвратить посторонние ссылки
,ConventionBuilder.HasMany.Always(x => x.Key.Column("owner_ref"))
Вот создание NHibernate DDL, когда я добавляю ConventionBuilder:
create table contact (contact_id int4 not null, number text, type text,
owner_ref int4, primary key (contact_id));
create table person (person_id int4 not null, person_name text not null, birthdate timestamp not null, primary key (person_id));
alter table contact
add constraint FK38B7242018FA494F
foreign key (owner_ref) references person;
Примечание больше нет поля Person_id, и теперь есть только одна ссылка, и это правильно. Так что это предотвращает дублирование ссылок, возможно, но я все еще не знаю, как изменить имя коллекции KeyColumn (IList ) в разделе Person в ConventionBuilder
Другой способ - просто изменить KeyColumn в ClassMap напрямую, предотвращая дублирование ссылок в таблице контактов ...
HasMany(x => x.Contacts).Inverse().KeyColumn("owner_ref");
..., достигнут тот же SQL, что и выше, но лучше, если я смогу сделать его автоматическим на ConventionBuilder.
Как я могу сказать NHibernate от создания двух ссылок? Вот код сопоставления (обратите внимание: публичный виртуальный владелец Person {get; set;} . Это не Person Person {get; set;}
public class Person
{
public virtual int PersonId { get; set; }
public virtual string PersonName { get; set; }
public virtual DateTime Birthdate { get; set; }
public virtual IList<Contact> Contacts { get; set; }
}
public class Contact
{
public virtual Person Owner { get; set; }
public virtual int ContactId { get; set; }
public virtual string Number { get; set; }
public virtual string Type { get; set; }
}
public class PersonMap : ClassMap<Person>
{
public PersonMap()
{
Id(x => x.PersonId);
Map(x => x.PersonName).Not.Nullable();
Map(x => x.Birthdate).Not.Nullable();
HasMany(x => x.Contacts).Inverse();
}
}
public class ContactMap : ClassMap<Contact>
{
public ContactMap()
{
References(x => x.Owner);
Id(x => x.ContactId).GeneratedBy.Sequence("contact_contact_id_seq");
Map(x => x.Number);
Map(x => x.Type);
}
}
Какой правильный ConventionBuilder для этого шаблона проектирования (суффикс "_ ref" для поля дочерней таблицы, ссылающегося на родительскую таблицу). Это может произойти и в системах с коричневыми полями.