为什么不是';我的FluentNHibernate引用属性是否更新?

为什么不是';我的FluentNHibernate引用属性是否更新?,nhibernate,fluent-nhibernate,nhibernate-mapping,fluent-nhibernate-mapping,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,Fluent Nhibernate Mapping,我正在使用FluentNHibernate尝试用一个非常简单的映射更新一个类(如下)。不必选择语言。当我插入并设置了Language属性时,一切都按预期进行。如果然后尝试执行更新,仅设置引用属性,则不会发出update语句。如果我更新了其中一个非引用属性和语言,则会发出update语句 我使用的是NH v.3.3.1.4000和FluentNH v.1.3.0.733 public class OrderItem { public OrderItem() { Or

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

我使用的是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; }
}
公共类OrderItem
{
公共订单项目()
{
OrderDate=DateTime.Now;
OrderStatus=Models.OrderStatus.Pending;
}
公共虚拟int-OrderId{get;set;}
公共虚拟语言{get;set;}
公共虚拟日期时间OrderDate{get;set;}
公共虚拟医嘱状态医嘱状态{get;set;}
}
公共类OrderItemMap:ClassMap
{
public OrderItemMap()
{
表(“tblOrder”);
Id(x=>x.OrderId);
映射(x=>x.OrderDate);
Map(x=>x.OrderStatus).CustomType(typeof(Int32));
引用(x=>x.Language,“LanguageID”).Cascade.None();
}
}
公共类语言映射:类映射
{
公共语言地图()
{
Id(x=>x.Id);
Map(x=>x.Name);
Map(x=>x.LanguageCode);
}
}
公共类语言
{
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟字符串语言代码{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);
NHibernateRepository语言db=新的NHibernateRepository(SessionFactory);
NHibernateRepository userdb=新的NHibernateRepository(SessionFactory);
var newItem=itemdb.All(),其中(x=>x.OrderId==16).First();
newItem.Language=languagedb.All(),其中(x=>x.Id==1.First();
//新项目。数量=200;
itemdb.Update(newItem);

尝试在
语言
参考上使用
Cascade.SaveUpdate()
,而不是
Cascade.None()


请在或官方NHibernate上阅读有关级联选项的更多信息。

您是否对这两个存储库使用了相同的会话?您是否在会话中使用了事务?如果是这样,请尝试执行
session.Commit()
或至少执行
session.Flush()
。更多详情请参见SO

我已经试过了,在你说了之后又试了一次。还是没什么。@Steven对不起,我刚意识到这对你的情况没有帮助。你能发布你的
语言
类和映射吗?另外,更新
语言
属性和保存
订单项
的代码是什么样子的?已更新。如果我设置了数量,一切都会按预期更新。@Steven只是一个愚蠢的问题。。。更改
语言
属性时,是要将其设置为另一种
语言
,还是已设置的语言?例如,在上面的示例中,
OrderItem.Language
是否已包含Id=1的
Language
?当您将属性设置为
null
时会发生什么?这是一个公平的问题。orderitem的语言为空,现在我正在尝试设置并更新它。不行。我尝试了session.Flush(),但没有提交,因为我没有使用事务。事务有效。现在,如果我显式地调用Flush,它会工作,尽管我已经将Flush模式设置为“始终”。我发誓昨晚没用!!伟大的事务、延迟操作和缓存通过nHibernateit连接,nHibernateit建议使用事务,我就是这样做的。阅读更多让我们