流畅的NHibernate添加和更新问题:参考

时间:2010-10-21 18:04:37

标签: fluent-nhibernate

当谈到流利的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);                

有人能给我一个提示/解决方案来帮助我吗?在这里查看相关问题,问题可能是任何问题。

2 个答案:

答案 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);