Fluent nhibernate Fluent NHibernate添加和更新问题:引用

Fluent nhibernate Fluent NHibernate添加和更新问题:引用,fluent-nhibernate,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 DateTi

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

有人能给我一个提示/解决方案来帮助我吗?通过查看此处的相关问题,问题可能是任何问题。

我不是100%确定,但看起来这里确实有一个bug:

temp.Company = ...(temp.Company.Id);
我想你实际上是从传入的参数中提取的

此外,您还可以通过使用Session.Load()避免在此处命中数据库:

temp.Company=\u session.Load(passedCompanyId);

我不是100%确定,但看起来这里可能有个bug:

temp.Company = ...(temp.Company.Id);
我想你实际上是从传入的参数中提取的

此外,您还可以通过使用Session.Load()避免在此处命中数据库:

temp.Company=\u session.Load(passedCompanyId);

好的,我就把这个扔掉。。。我打赌现在发生的是,您正在通过更改Id来设置temp.Company.Id,然后您使用repo来使用更改的Id获取该公司。但是,NHibernate将跟踪您在另一家公司上更改的Id。使用临时变量存储新的公司id,不要更改另一家公司的id。

好的,我将把它扔掉。。。我打赌现在发生的是,您正在通过更改Id来设置temp.Company.Id,然后您使用repo来使用更改的Id获取该公司。但是,NHibernate将跟踪您在另一家公司上更改的Id。使用临时变量存储新公司id,不要更改另一家公司的id。

这里有一些缺少且令人困惑的信息。在最后一段代码中,是否要执行_session.Update(temp)?如果不是,什么是c?您是否从您传递给公司回购的同一个会话中获得临时/c?此外,你看到当你调用回购行时,你基本上是在将它设置回它自己的状态,这是正确的吗?你这里有一些缺乏和混乱的信息。在最后一段代码中,是否要执行_session.Update(temp)?如果不是,什么是c?您是否从您传递给公司回购的同一个会话中获得临时/c?另外,你看到当你调用回购行时,你基本上是在把它设置回它自己的状态,这就是我所做的。让我看看能不能修好,明白了!我在控制器操作中添加了一个新参数,重命名了控制它的dropdownlist,以便它将公司id传递给控制器操作和使用的会话。load(companyId)太糟糕了,我无法将你们两个都设置为正确答案,因为你们都帮助了我。耶,我们需要部分答案功能。。。很高兴你修好了。请记住,您将POCO视为一个POCO,但您必须使用virtual标记所有内容的原因是,NHibernate将进入并添加“秘密酱汁”,以便它可以跟踪所有更改。这就是为什么这些东西也很难序列化。。。他们身上有多余的垃圾,这就是我在做的。让我看看能不能修好,明白了!我在控制器操作中添加了一个新参数,重命名了控制它的dropdownlist,以便它将公司id传递给控制器操作和使用的会话。load(companyId)太糟糕了,我无法将你们两个都设置为正确答案,因为你们都帮助了我。耶,我们需要部分答案功能。。。很高兴你修好了。请记住,您将POCO视为一个POCO,但您必须使用virtual标记所有内容的原因是,NHibernate将进入并添加“秘密酱汁”,以便它可以跟踪所有更改。这就是为什么这些东西也很难序列化。。。他们身上有多余的垃圾。
temp.Company = _session.Load<Company>(passedInCompanyId);