I´m trying to get work the NHibernate mappings bellow but I have a the following error message:
NHibernate.MappingException HResult=0x80131500 Message=property mapping has wrong number of columns: CAF.Properties type: component[Codigo,Armazem,CAA_Armazem] Source=NHibernate
StackTrace: at NHibernate.Mapping.PersistentClass.Validate(IMapping mapping) in R:\github\nhibernate-core\src\NHibernate\Mapping\PersistentClass.cs:line 963 at NHibernate.Mapping.RootClass.Validate(IMapping mapping) in R:\github\nhibernate-core\src\NHibernate\Mapping\RootClass.cs:line 370 at NHibernate.Cfg.Configuration.ValidateEntities() in R:\github\nhibernate-core\src\NHibernate\Cfg\Configuration.cs:line 1042 at NHibernate.Cfg.Configuration.Validate() in R:\github\nhibernate-core\src\NHibernate\Cfg\Configuration.cs:line 970 at NHibernate.Cfg.Configuration.BuildSessionFactory() in R:\github\nhibernate-core\src\NHibernate\Cfg\Configuration.cs:line 1268
If I remove the property-ref
attribute from many-to-one
element, the mapping compiles but the key field used to join is not correct (Entity2.Id instead of Entity2.Ref).
NHibernate 5.1.3, .Net Core 2.1
<class name="Entity, Web" entity-name="Entity1" table="Table1">
<id type="int" name="Id">
<column name="Id"/>
<generator class="native"/>
</id>
<dynamic-component name="CustomProperties">
<property name="Ref" type="string" />
<property name="Entity2Ref" type="string" />
<many-to-one name="Entity2Join"
column="Entity2Ref"
entity-name="Entity2"
property-ref="CustomProperties.Ref"
insert="false"
update="false"
foreign-key="none"
fetch="join">
</many-to-one>
</dynamic-component>
</class>
<class name="Entity, Web" entity-name="Entity2" table="Table2">
<id type="int" name="Id">
<column name="Id"/>
<generator class="native"/>
</id>
<dynamic-component name="CustomProperties">
<property name="Ref" type="string" unique="true" />
<property name="Property1" type="string" />
<property name="Property2" type="string" />
<property name="Property3" type="string" />
</dynamic-component>
</class>
public class Entity : DynamicObject
{
public virtual int Id { get; set; }
private IDictionary _properties = null;
public virtual IDictionary Properties
{
get
{
if (_properties == null)
{
_properties = new Hashtable();
}
return _properties;
}
set
{
_properties = value;
}
}
public override bool TryGetMember(
GetMemberBinder binder, out object result)
{
string name = binder.Name;
result = null;
if (!Properties.Contains(name))
{
result = "";
return true;
}
result = Properties[name];
return true;
}
public override bool TrySetMember(
SetMemberBinder binder, object value)
{
Properties[binder.Name] = value;
return true;
}
}
User contributions licensed under CC BY-SA 3.0