Свободная проблема с добавлением и обновлением NHibernate: Ссылки - PullRequest
0 голосов
/ 21 октября 2010

Я довольно nbbish, когда дело доходит до беглого nhibernate, но у меня есть неожиданная ошибка в одном из моих репозиториев.

У меня есть тип данных CostCode

public class CostCode
{
    public virtual int Id { get; set; }
    public virtual String CostCodeCode { get; set; }
    public virtual Company Company { get; set; }
    public virtual DateTime CreatedDate { get; set; }
    public virtual String CreatedBy { get; set; }
    public virtual DateTime ModifiedDate { get; set; }
    public virtual String ModifiedBy { get; set; }
}

и вот отображение

public sealed class CostCodeMap : ClassMap<CostCode>
{
    /**
     * @breif Mapping Constructor
     */

    public CostCodeMap()
    {
        Id(Reveal.Member<CostCode>("Id"));
        Map(x => x.CostCodeCode).Not.Nullable();
        References(x => x.Company, "CompanyId").Cascade.All();
        Map(x => x.CreatedDate).Not.Nullable();
        Map(x => x.CreatedBy).Not.Nullable();
        Map(x => x.ModifiedDate).Not.Nullable();
        Map(x => x.ModifiedBy).Not.Nullable();
    }
}

Когда я пытаюсь обновить это, я получаю сообщение об ошибке "идентификатор экземпляра Domain.DataTypes.Company был изменен с 1 на 8"

Теперь я думаю, что это способ, которым я настроил отображение, и, возможно, как мой репозиторий обрабатывает обновления / добавления.

У меня есть выпадающий список, который управляет идентификатором компании, и когда я добавляю / обновляю его, я устанавливаю для свойства компании то, что находится в базе данных для идентификатора, до которого она была обновлена.

var companyRepository= new CompanyRepository(_session);
temp.Company = companyRepository.GetCompanyById(temp.Company.Id);

_session.Update(c);                

Может кто-нибудь дать мне подсказку / решение, чтобы помочь мне на моем пути? Просматривая здесь связанные проблемы, проблема может быть чем угодно.

Ответы [ 2 ]

2 голосов
/ 21 октября 2010

Хорошо, я просто выкину это ... Держу пари, что вы устанавливаете temp.Company.Id, изменив Id, затем вы используете репо, чтобы получить эту компанию, используя измененный Id.NHibernate будет отслеживать, что вы изменили идентификатор другой компании, однако.Используйте временную переменную для хранения нового идентификатора компании, не меняйте идентификатор другой компании.

1 голос
/ 21 октября 2010

Я не уверен на 100%, но похоже, что здесь есть ошибка:

temp.Company = ...(temp.Company.Id);

Я бы подумал, что вы на самом деле извлекаете это из входящего параметра.

Кроме того, вы можете избежать попадания в базу данных, используя Session.Load ():

temp.Company = _session.Load<Company>(passedInCompanyId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...