Ошибка правильная.Я предполагаю, что вы используете SchemaExport
для генерации ваших таблиц на основе отображений NHibernate, так как ошибка, которую вы получаете, звучит так, как если бы вы создавали свои таблицы и внешние ключи.SchemaExport
приведет к созданию таблиц, аналогичных приведенным ниже (обратите внимание на объяснения, разбросанные по всему коду):
CREATE TABLE LocationSearchView (
LocationId int NOT NULL,
ContentProviderId int NOT NULL,
CategoryId int NOT NULL,
/* ...other columns... */
/* Note: Generated from LocationSearchView's "composite-id" element. */
PRIMARY KEY (LocationId, ContentProviderId, CategoryId)
);
/* Note: Table for the "Event" class. */
CREATE TABLE VolatileEventContent (
LocationId int NOT NULL,
ContentProviderId int NOT NULL,
/* ...other columns... */
/* Note: Generated from Event's "composite-id" element. */
PRIMARY KEY (LocationId, ContentProviderId),
/* Note: Generated from the "key" element of LocationSearchView's Events bag. */
FOREIGN KEY (LocationId, ContentProviderId) REFERENCES LocationSearchView (LocationId, ContentProviderId)
);
... отсюда ошибка.Внешний ключ должен указывать на полный первичный или уникальный ключ, а не только на часть первичного ключа.Весь ключ - 3 столбца, а не 2. Почему NHibernate использует эти столбцы для внешнего ключа?Из-за <key>
элемента LocationSearchView
Events
сумки.<key>
указывает, какие столбцы из child указывают на parent .
Давайте рассмотрим, что может произойти, если вы (или NHibernate) попытаетесь выбрать из этих таблиц,Допустим, следующие данные:
TABLE LocationSearchView
LocationId ContentProviderId CategoryId
========== ================= ==========
1 3 5
1 3 6
1 4 5
1 4 6
2 3 5
2 3 6
2 4 5
2 4 6
TABLE VolatileEventContent
LocationId ContentProviderId
========== =================
1 3
1 4
2 3
2 4
Невозможно, чтобы «один» LocationSearchView
имел «много» * 1021 * с.Скорее, должно быть наоборот.Учитывая эти таблицы, на самом деле существует отношение один ко многим от Event
до LocationSearchView
.
Я не знаю, как правильно решить эту проблему, потому что я не знаю, чтоВы пытаетесь выполнить, но, надеюсь, это поможет осветить, в чем именно проблема.