0

я получил полиморфный отношения, как в следующем примере:Как я могу остановить 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.

ответ

2

Это следует сделать это:

HasManyToMany(x => x.As) 
    .ForeignKeyConstraintNames("no", "no"); 
+0

Thats it! Большое спасибо. Я думал, что метод ForeignKeyConstraintNames определяет шаблон именования, поэтому ключи не называются случайными шестнадцатеричными значениями;) – Zebi

+0

Он тоже делает это. Это эквивалентно атрибуту внешнего ключа, о котором говорили другие люди. –

+0

ForeignKeyConstraintNames («no», «no») не работает (по крайней мере, в Fluent NHibernate 1.3.0.717, который я сейчас использую в одном из моих проектов). Хорошо, что ForeignKeyConstraintNames («none», «none») делает :) –

1

Я не совсем знаком с FluentNHibernate, но я предполагаю, что вы могли бы установить этот пользовательский атрибут на вашем картографирования для коллекции, используя что-то вроде:

.SetAttribute("foreign-key", "no")

+0

Не могу проверить это до завтра на работе, однако я относительно уверен, что на сопоставлении нет метода SetAttribute. Я уже использовал этот метод в объекте конфигурации, чтобы установить размер партии, и моя первая мысль заключалась в том, чтобы сделать это таким же образом в определении отображения. – Zebi

+0

@ Zebi: Я считаю, что ты прав; при просмотре документов FluentNHibernate это не похоже на то, что вы можете использовать .SetAttribute() для сопоставления коллекции ... – DanP

+0

Просто появилась идея указать автопарк в несколько другой тестовой папке (b + c получить интерфейс IChild, A получает список IChild) и наблюдать, что происходит. Это должно привести к отображению Many-to-Any ... возможно, он правильно отображает соответствия. – Zebi

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