为什么我的FluentNHibernate References属性没有更新?

时间:2012-07-22 21:46:15

标签: nhibernate fluent-nhibernate nhibernate-mapping fluent-nhibernate-mapping

我正在使用FluentNHibernate尝试使用非常简单的映射更新类(如下所示)。不必选择语言。当我执行Insert并且我已经设置了Language属性时,一切都按预期工作。如果我然后尝试进行更新,仅设置引用属性,则不会发出更新语句。如果我更新其中一个非引用属性和语言,则会发出更新语句。

我正在使用NH v.3.3.1.4000和FluentNH v.1.3.0.733。

public class OrderItem
{
    public OrderItem()
    {
        OrderDate = DateTime.Now;
        OrderStatus = Models.OrderStatus.Pending;
    }

    public virtual int OrderId { get; set; }
    public virtual Language Language { get; set; }
    public virtual DateTime OrderDate { get; set; }
    public virtual OrderStatus OrderStatus { get; set; }
}


public class OrderItemMap : ClassMap<OrderItem>
{
    public OrderItemMap()
    {
        Table("tblOrder");

        Id(x => x.OrderId);

        Map(x => x.OrderDate);
        Map(x => x.OrderStatus).CustomType(typeof(Int32));


        References(x => x.Language, "LanguageID").Cascade.None();

    }
}

public class LanguageMap : ClassMap<Language>
{
    public LanguageMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        Map(x => x.LanguageCode);
    }
}

public class Language
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string LanguageCode { get; set; }
}

//更新对象的代码。取消注释代码设置数量会强制更新,但只设置语言不会。

        NHibernateRepository<Language> languagedb = new NHibernateRepository<Language>(SessionFactory);
        NHibernateRepository<UserDetail> userdb = new NHibernateRepository<UserDetail>(SessionFactory);

        var newItem = itemdb.All().Where(x => x.OrderId == 16).First();

        newItem.Language = languagedb.All().Where(x => x.Id == 1).First();
        //newItem.Quantity = 200;

        itemdb.Update(newItem);

2 个答案:

答案 0 :(得分:1)

尝试在Cascade.SaveUpdate()引用上使用Language,而不是Cascade.None()

详细了解Ayende's post或官方NHibernate documentation上的级联选项。

答案 1 :(得分:0)

您是否为两个存储库使用了相同的会话?您是否在会话中使用了交易?如果是,请尝试session.Commit()或至少session.Flush()。更多细节here在SO