【问题标题】:Fluent NHibernate Adding and Updating problem : ReferencesFluent NHibernate 添加和更新问题:参考资料
【发布时间】:2010-10-21 18:04:37
【问题描述】:

当谈到流畅的 nhibernate 时,我相当 n00bish,但我的一个存储库中有一个意外错误。

我有一个数据类型 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 的下拉列表,当我添加/更新时,我将属性 company 设置为数据库中已更新到的 id 的任何内容。

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

_session.Update(c);                

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

【问题讨论】:

  • 这里有一些缺失和混乱的信息。在最后一个代码部分,你不想做 _session.Update(temp); ?如果不是,c是什么?您是否从传递给公司 repo 的同一会话中获得 temp/c?另外,您发现当您正确调用 repo 行时,您基本上是在将其设置回自身?

标签: fluent-nhibernate


【解决方案1】:

好的,我将把它扔掉......我敢打赌,您正在通过更改 ID 设置 temp.Company.Id,然后您使用 repo 使用更改后的 ID 获取该公司。然而,NHibernate 将跟踪您更改了另一家公司的 ID。使用临时变量来存储新的公司 ID,不要更改其他公司的 ID。

【讨论】:

  • 这就是我正在做的事情。让我看看能不能解决它。
  • 你明白了!我在控制器操作中放置了一个新参数,重命名了控制它的下拉列表,以便它将公司 ID 传递给控制器​​操作并使用 session.load(companyId)
  • 很糟糕,因为你们都帮助了我,所以我不能把你们两个都设置为正确的答案。
  • 是的,我们需要部分回答能力......很高兴你把它修好了。请记住,您将 POCO 视为只是一个 POCO,但您必须使用 virtual 标记所有内容的原因是因为 NHibernate 会进入并添加秘密调味料,因此它可以跟踪所有更改。这就是为什么这些东西也很难序列化的原因……它们上面有额外的垃圾。
【解决方案2】:

我不是 100% 确定,但看起来这里可能存在错误:

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

我认为您实际上是从传入参数中提取的。

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

temp.Company = _session.Load<Company>(passedInCompanyId);

【讨论】:

    猜你喜欢
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多