FluentNHibernate を使用して、非常に単純なマッピング (以下) でクラスを更新しようとしています。言語を選択する必要はありません。Insert を実行し、Language プロパティを設定すると、すべてが期待どおりに機能します。次に、参照プロパティのみを設定して更新を試みても、更新ステートメントは発行されません。非参照プロパティの 1 つと言語を更新すると、更新ステートメントが発行されます。
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);