Обновление внешнего ключа до значения Null с помощью nhibernate - PullRequest
0 голосов
/ 31 января 2011

У меня есть две таблицы BuildGroup и таблица DocumentTemplate.Таблица DocumentTemplate имеет BuildGroupId в качестве внешнего ключа, который можно обнулять.В определенном сенарио я обновляю BuildGroupId в таблице DocumentTemplate.

public bool EditDocTempForBldGrp(int docId, int bldGrpId)
    {
        try
        {
            using (ISession session = Document.OpenSession())
            {
                using (ITransaction transaction = session.BeginTransaction())
                {
                    HSDocumentTemplate objDocBO = new HSDocumentTemplate();

                    objDocBO = GetDocumentDetailsById(docId);
                    HSBuildGroup objBldGrp = new HSBuildGroup();

                    if (bldGrpId != 0)
                    {                            
                        objBldGrp.Id = bldGrpId;
                    }
                    else
                    {
                        //int ? bldid = null;
                        //objDocBO.HSBuildGroup.Id = null;
                        //objDocBO.HSBuildGroup.Id = DBNull.Value;
                        //objDocBO.HSBuildGroup.Id = -1;

                    }
                    objDocBO.HSBuildGroup = objBldGrp;
                    session.Update(objDocBO);
                    transaction.Commit();
                }
            }
            return true;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            return false;
        }

    }

В другом сенарио мне нужно снова установить BuildGroupId в таблице DocumentTemplate на dbnull.value.Я пробовал в разных случаях, как в блоке else.Это дает ошибку: не может неявно преобразовать тип 'System.DBNull' в 'int'.Как я могу обновить значение внешнего ключа с помощью NULL?Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 31 января 2011

Несколько замечаний:

  • Вы не должны присваивать Id объекту HSBuildGroup, а вместо этого загружать экземпляр через Session.Load (), если bldGrpId не равен 0.
  • Вы можете просто установить группу сборки документа в null, как это:

    objDocBO.HSBuildGroup = null;

    NHibernate позаботится обо всем остальном.

Надеюсь, это поможет.

1 голос
/ 02 февраля 2011

Используйте Session.Load и null, как сказала Кей Херзам.

Вы должны быть уверены, что документ существует для вызова сеанса. Загрузка.Пример:

public bool EditDocTempForBldGrp(int docId, int bldGrpId)
{
    try
    {
        using (ISession session = Document.OpenSession())
        using (ITransaction transaction = session.BeginTransaction())
        {
           session.Get<HSDocumentTemplate>(docId).HSBuildGroup 
                      = bldGrpId = 0 ? null : session.Load<HSBuildGroup>(bldGrpId);
               transaction.Commit();
        }
    }
}

Таким образом, nhibernate выполнит что-то вроде

select ... from DocumentTemplate where DocId = ..;
UPDATE DocumentTemplate SET .... , BuildGroupId = null where DocumentId = XX;

или

select ... from DocumentTemplate where DocId = ..;
UPDATE DocumentTemplate SET .... , BuildGroupId = YY where DocumentId = XX;

Примечание нет выбора дляBuildGroup для базы данных.

Если вы не уверены в существовании группы сборки, ваш код должен выглядеть следующим образом:

public bool EditDocTempForBldGrp(int docId, int bldGrpId)
{
        try
        {
            using (ISession session = Document.OpenSession())
            using (ITransaction transaction = session.BeginTransaction())
            {
               session.Get<HSDocumentTemplate>(docId).HSBuildGroup 
                      = session.Get<HSBuildGroup>(bldGrpId);
               transaction.Commit();
            }
         }
}

Таким образом, nhibernate будет выполнять что-то вроде

select ... from DocumentTemplate where DocId = ..;
SELECT .... FROM BuildGroup where buildgroupid = ZZ;
UPDATE DocumentTemplate SET .... , BuildGroupId = null where DocumentId = XX;

Get автоматически возвращает null, если объект не существует.

Наконец, вам не нужно вызывать Session.Update () для повторного присоединения объекта.Все, что связано с сеансом, будет сброшено при фиксации транзакции.

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