я получил полиморфный отношения, как в следующем примере:Как я могу остановить Fluent NHibernate от создания внешних ключей
public class A
{
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
}
Класс B & C contining список из'S:
public class B/C
{
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<A> As { get; set; }
public virtual SomeParent Parent { get; set; }
}
Моя цель являются запросы, такие как
session.Linq<B>().Where(x => x.Parent == someParent && x.As.Contains(someA));
В настоящее время я настроил отношение «многие-ко-многим» между B => A и C => A, используя таблицу общих ссылок, потому что я хочу иметь все мои ссылки в одной таблице. В этом примере экспорт NH shema создает 4 таблицы, A, B, C и ChildToA.
HasManyToMany(x => x.As)
.AsBag()
.Table("XX_ChildToA")
.ParentKeyColumn("Child_ID")
.ChildKeyColumn("A_ID")
.Cascade.All()
Это прекрасно работает до тех пор, пока вы используете только один типы дочернего, поскольку экспорт Шм создает внешний ключ, ограничивающий «Child_ID» в идентификаторы любой таблицы она попадет первую при экспорте (B в данном случае).
var b = session.Get<B>(id);
b.As.Add(someA);
tx.Commit(); // works fine
var c = session.Get<C>(id);
c.As.Add(someA);
tx.Commit(); // crashes because of FK constraint
Могу ли я остановить FluentNHibernate от создания этого FK? Пока я искал google для этой проблемы, я заметил образцы HBM с атрибутами foreign-key = «no» во многих отношениях. Итак, NHibernate должен уметь это решить, правильно? Однако я хотел бы сохранить свои текущие сопоставления, потому что я могу создать общий базовый класс сопоставления для всех моих дочерних типов таким образом, и в настоящее время все наши сопоставления являются сопоставлениями FNH.
Thats it! Большое спасибо. Я думал, что метод ForeignKeyConstraintNames определяет шаблон именования, поэтому ключи не называются случайными шестнадцатеричными значениями;) – Zebi
Он тоже делает это. Это эквивалентно атрибуту внешнего ключа, о котором говорили другие люди. –
ForeignKeyConstraintNames («no», «no») не работает (по крайней мере, в Fluent NHibernate 1.3.0.717, который я сейчас использую в одном из моих проектов). Хорошо, что ForeignKeyConstraintNames («none», «none») делает :) –