当谈到流利的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”
现在我认为它是我设置映射的方式,也可能是我的存储库处理更新/添加的方式。
我有一个控制公司ID的下拉列表,当我添加/更新时,我将属性公司设置为数据库中已更新为的id的任何内容。
var companyRepository= new CompanyRepository(_session);
temp.Company = companyRepository.GetCompanyById(temp.Company.Id);
_session.Update(c);
有人能给我一个提示/解决方案来帮助我吗?在这里查看相关问题,问题可能是任何问题。
答案 0 :(得分:2)
好吧,我会抛出这个...我打赌发生的事情是你通过更改Id设置temp.Company.Id,然后使用repo使用更改后的Id获取该公司。然而,NHibernate将跟踪您更改了另一家公司的Id。使用temp var存储新的公司ID,不要更改其他公司的id。
答案 1 :(得分:1)
我不是百分百肯定,但看起来好像这里有一个错误:
temp.Company = ...(temp.Company.Id);
我认为你实际上是从传入的参数中提取它。
此外,您可以使用Session.Load()来避免数据库命中:
temp.Company = _session.Load<Company>(passedInCompanyId);