Свободное имя динамического свойства nHibernate - PullRequest
0 голосов
/ 19 мая 2011

Я хочу, чтобы это отображение работало:

    Map(x => x.First, "First_ID");
    Map(x => x.Second, "Second_ID")

    References(x => x.SomeProperty)
        .Access.AsCamelCaseField(Prefix.Underscore)
        .Nullable()
        .NotFound.Ignore()
        .WithColumns("First_ID", "Second_ID")
        .LazyLoad();

Это не работает, когда я хочу вставить объект в базу данных.Это говорит: Неверный индекс N для этой SqlParameterCollection с Count = N error

Я нашел ответ на вопрос здесь: http://devlicio.us/blogs/derik_whittaker/archive/2009/03/19/nhibernate-and-invalid-index-n-for-this-sqlparametercollection-with-count-n-error.aspx

Но ответ говорит, что мне нужно удалить приведенный ниже код, чтобы заставить вставку работать

  Map(x => x.First, "First_ID");
  Map(x => x.Second, "Second_ID")

Проблема в том, что я не могу удалить сопоставления, потому что таким образом моя сущность не может быть извлечена из базы данных.Это чем говорит, что он не может найти первый и второй столбцы в таблице.Я понимаю, почему это происходит, но есть ли способ решить проблему, не удаляя сопоставления?Просто чтобы изменить что-то в этом коде:

References(x => x.SomeProperty)
        .Access.AsCamelCaseField(Prefix.Underscore)
        .Nullable()
        .NotFound.Ignore()
        .WithColumns("First_ID", "Second_ID")
        .LazyLoad();

Например, не использовать литералы для имен столбцов, но некоторый код, который «знает», что в этом свойстве сопоставления First сопоставляется с «First_ID» без явного указанияимя столбца?

PS Я пытался использовать

References(x => x.SomeProperty)
        .Access.AsCamelCaseField(Prefix.Underscore)
        .Nullable()
        .NotFound.Ignore()
        .WithColumns(x => x.First, x => x.Second)
        .LazyLoad();

Не работает.

Другое решение для удаленных сопоставлений - изменить запрос, который получает сущность из БД, но в этом случае мне нужно добавить дополнительное объединение - это глупо, потому что у меня есть столбец в моей собственной таблице, зачем мнесделать соединение, а затем добавить некоторые ограничения, когда мне не нужно это соединение.

1 Ответ

2 голосов
/ 19 мая 2011

Вы можете указать, что свойства не должны обновляться, выполнив:

Map(x => x.First, "First_ID").Not.Update();
Map(x => x.Second, "Second_ID").Not.Update();

Или, если единственная причина, по которой вы хотите иметь эти свойства, - это использовать их в запросах. Вы можете либо сделай

Map(x => x.First, "First_ID").Access.None();
Map(x => x.Second, "Second_ID").Access.None();

Или, проще, удалите эти свойства и используйте старые добрые файлы hbm для отображения ваших сущностей и укажите access="none" для ваших свойств. Таким образом, они будут доступны вам через Criteria и HQL, но на самом деле они не должны существовать в вашей организации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...