Как обновить первичный ключ с помощью nhibernate - PullRequest
2 голосов
/ 29 августа 2011

Первичным ключом для одной из моих таблиц является строка. Строка - это код, который я хотел бы обновить в какой-то момент времени. Как я могу сделать это в nhibernate. Обратите внимание, что к этому столбцу подключен внешний ключ, к которому мне нужно каскадно обновлять.

Ради обсуждения предположим, что мое отображение такое, как показано ниже

public class Code
{
    public virtual string Id { get; set; }
    public virtual string Name { get; set; }

    public class CodeMap : ClassMap<Code>
    {
        public CodeMap()
        {
            Table("BusinessCode");
            Id(x => x.Id, "Id");
            Map(x => x.Name, "Name").Nullable();
        }

    }
}    

public class Data
{
    public virtual int Key { get; set; }
    public virtual Code DataCode{ get; set; }
    public virtual string Desc { get; set; }
    public class DataMap : ClassMap<Data>
    {
        public DataMap()
        {
            Table("Data");
            Id(x=>x.Key,"Key");
            Map(x => x.Desc).Column("desc");
            References(x => x.Code, "BusinessCode").Nullable().Cascade.SaveUpdate();
        }
    }
}

Структура стола

BusinessCode Table
Id(nvarchar(100)) -primarykey
Name(nvarchar(1024))



Data Table
id(int) - auto generated primary key
businesscode(nvarchar(100)) - foreign key to BusinessCode Id
desc(nvarchar(1024))

вот код, который я использую для обновления моего объекта

using (var trans = Session.BeginTransaction())
            {
                var modifiedSource = Session.Load<Code>(id);
                modifiedSource.Id = "newId";
                modifiedSource.Name = "new name";
                Session.Update(modifiedSource);
                trans.Commit();
            }

1 Ответ

3 голосов
/ 29 августа 2011

Попробуйте назначить генератор идентификаторов :

<class name="Dataset" table="Dataset" >
    <id name="id" column="id" type="String">
        <generator class="assigned" />
    </id>
    ...
</class>

Или

Id(x => x.Id).GeneratedBy.Assigned();

Из NHibernate Документ

5.1.4.7. Назначенные идентификаторы

Если вы хотите, чтобы приложение назначало идентификаторы (в отличие от имея NHibernate генерировать их), вы можете использовать назначенный генератор. Этот специальный генератор будет использовать значение идентификатора, уже назначенное в свойство идентификатора объекта. Будьте очень осторожны при использовании этого возможность назначать ключи с деловым смыслом (почти всегда ужасно дизайнерское решение).

Из-за присущей ему природы сущности, использующие этот генератор, не могут быть сохранено с помощью метода SaveOrUpdate () ISession. Вместо этого вы должны явно указывает для NHibernate, если объект должен быть сохранен или обновляется с помощью метода Save () или Update () ISession.

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