NHibernate不更新实体的所有属性
我在FluentNHibernate中遇到了一个奇怪的问题:当我保存实体时,其中一个(引用)属性没有更新。其他属性(字段和引用)都会更新,失败的属性也会正确映射(检索实体就像一个符咒) 对我正在做的事情的(稍微简化)描述:NHibernate不更新实体的所有属性,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我在FluentNHibernate中遇到了一个奇怪的问题:当我保存实体时,其中一个(引用)属性没有更新。其他属性(字段和引用)都会更新,失败的属性也会正确映射(检索实体就像一个符咒) 对我正在做的事情的(稍微简化)描述: 在我的MVC操作方法中,绑定并设置了一个InputModel。它有一个用于TypeID的属性,我希望在这里设置实体的类型(我们将实体类型称为Thing) 创建一个新的对象,并复制输入模型的简单属性。对于两个复杂属性,其中类型属性不起作用,另一个属性不起作用,执行以下操作: 2
InputModel
。它有一个用于TypeID
的属性,我希望在这里设置实体的类型
(我们将实体类型称为Thing
)对象
,并复制输入模型
的简单属性。对于两个复杂属性,其中类型
属性不起作用,另一个属性不起作用,执行以下操作:2.1. 根据提供的类型id,从存储库中获取正确的
ThingType
。2.2. 在新的
thing
对象上设置类型(使用thing.type=theType
)东西
是根据输入模型上的id(与TypeID
不同的id)从存储库中获取的session.Save()保存原始的内容
代码>李>
如上所述,只有一个属性不起作用——其他属性(据我所知)遵循完全相同的模式,起作用。我还调试并验证了原始的东西
在传递到session.Save()时是否具有正确的、更新的类型
我不知道从哪里开始解决这个问题
更新:类是普通POCO:
public class Thing
{
public int ID { get; set; }
public string SomeSimpleProp { get; set; }
public ThingType Type { get; set; }
public OtherEntity OtherReference { get; set; }
}
public class ThingType
{
public int ID { get; set; }
public string Name { get; set; }
}
我的精确映射(类型和属性的名称除外)如下所示:
// In ThingMap : ClassMap<Thing> constructor:
Id(t => t.ID).Column("ThingID");
Map(t => t.SomeSimpleProp);
References(t => t.Type).Column("ThingTypeID");
References(t => t.OtherReference).Column("OtherReferenceID");
// In ThingTypeMap : ClassMap<ThingType> constructor:
Id(t => t.ID).Column("ThingTypeID");
Map(t => t.Name);
//在ThingMap:ClassMap构造函数中:
Id(t=>t.Id).列(“ThingID”);
Map(t=>t.SomeSimpleProp);
引用(t=>t.Type).Column(“ThingTypeID”);
引用(t=>t.OtherReference).Column(“OtherReferenceID”);
//在ThingTypeMap:ClassMap构造函数中:
Id(t=>t.Id).Column(“ThingTypeID”);
Map(t=>t.Name);
正如我所说,OtherReference
已正确更新,而Type
未正确更新。它们映射相同,因此我不认为这可能是映射错误。为了更新引用,您应该指定
。为了更新引用,您应该指定
。为了澄清:更新的不是实际的类型
,而是引用的类型。这是否仍然适用?因为它正在处理其他属性,而没有这个…@Tomas Lycken可能正在提供地图和类,这个问题可能会有所帮助。澄清一下:更新的不是实际的类型
,而是对象
引用的类型。这是否仍然适用?因为它正在处理其他属性,而没有这个…@Tomas Lycken可能正在提供映射和类int,这个问题可能会有所帮助。如果实体来自数据库,则不需要调用session.Save。提供一些(相关的)真实代码和/或映射(请简化为重要的部分)。您是如何设置映射的?@Stefan:进一步调查后,我发现这是一个事务问题,源于我试图调用session.Save()。如果将其添加为答案,我会将其标记为accepted=)如果实体来自数据库,则不需要调用session.Save。提供一些(相关的)真实代码和/或映射(请简化为重要的部分)。您是如何设置映射的?@Stefan:进一步调查后,我发现这是一个事务问题,源于我试图调用session.Save()。如果您将其添加为答案,我会将其标记为已接受=)