Al Lelopath
Al Lelopath

Reputation: 6778

Cascade value for property in partial class

I have a mapping and POCOs as below. The problem is that tbFNamesFeature is not being updated when this object is saved (whereas tblFeature is) I've tried different values for cascade, to no effect, so I'd have to say there's something I don't get. (see ??? in the xml).
What am I doing wrong?

tbFNamesFeature has 2 columns:

FNamesId (PK, int, not null)
FeatureId (PK, int, not null)

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Feature, Infrastructure.Interface"
         table="tblFeature">
    <id name="Id" type="Int32" unsaved-value="0">
      <column name="FeatureId" sql-type="int" not-null="true" unique="true" index="PK_tblFeature" />
      <generator class="native" />
    </id>
    <property name="Description" type="String">
      <column name="Description" length="100" sql-type="varchar" not-null="false" />
    </property>
    <bag name="FNames" table="tbFNamesFeature" inverse="true" lazy="false" cascade="???">
      <key>
        <column name="FeatureId" sql-type="int" not-null="true" />
      </key>
      <many-to-many class="FName, Infrastructure.Interface">
        <column name="FNamesId" sql-type="int" not-null="true" />
      </many-to-many>
    </bag>
  </class>
</hibernate-mapping>

Feature.cs

public partial class Feature : System.IComparable
{
        protected int id;
        protected string description;

        public virtual int Id
        {
            get { return this.id; }
            set { this.id = value; }
        }

        public virtual string Description
        {
            get { return this.description; }
            set { this.description = value; }
        }
}

Feature.part.cs

public partial class Feature : System.IComparable
{
        private System.Collections.Generic.IList<FName> fnames;

        public virtual System.Collections.Generic.IList<FName> FNames
        {
            get
            {
                if (this.fnames == null)
                {
                    this.fnames = new System.Collections.Generic.List<FName>();
                }
                return this.fnames;
            }
            set {
                this.fnames = value;
            }
        }
 }

Upvotes: 0

Views: 138

Answers (1)

gusgorman
gusgorman

Reputation: 170

edited to reflect discussion: As tblFNamesFeature is a many-to-many table, the mapping needs to be set up with inverse="false" to indicate that other end the relationship is not responsible for saving the collection.

cascade="all" also needs to be set (which covers saves, updates, and deletes).

Upvotes: 1

Related Questions