I think it is better to change access in mapping to "field"
2014-02-25 22:54 GMT+13:00 Ricardo Peres <[email protected]>: > For collections, you can instantiate them in the constructor: > > this.Budgets = new List<Budget>(); > > RP > > > On Tuesday, February 25, 2014 9:06:59 AM UTC, Ricardo Peres wrote: >> >> Well, you are returning a list which encapsulates a read-only collection!! >> Replace all your fields with auto properties: >> >> * public string InvestmentTypeNote {* >> * get;* >> * set;* >> * }* >> * public IList<Budget> Budgets {* >> * get;* >> * protected set;* >> * }* >> >> This will solve your problem. >> >> RP >> >> >> On Tuesday, February 25, 2014 2:15:30 AM UTC, Veasna MUCH wrote: >>> >>> When I update xml schmas in budget.hbm.xml as your suggestion >>> >>> >>>> * <many-to-one name="oAirport" column="AirportID"* >>>> * class="Tec.Core.Model.Airport, Tec.Core" not-null="true" >>>> cascade="save-update"/> * >>>> * <many-to-one name="oInvestmentCode" column="InvestmentCodeID"* >>>> * class="Tec.Core.Model.InvestmentCode, Tec.Core" not-null="true" >>>> cascade="save-update"/> * >>>> * <many-to-one name="oInvestmentType" column="InvestmentTypeID"** >>>> class="Tec.Core.Model.InvestmentType, Tec.Core" not-null="true" >>>> cascade="save-update"/> * >>> >>> >>> >>> I got the following exception class InvestmentCode.cs >>> ------------------------------------------------------------ >>> ------------------------------------------------------------ >>> >>> *public void AddBudget(Budget imntBudget){* >>> * if (imntBudget != null && >>> !_lInvestmentCodeBudgets.Contains(imntBudget)){* >>> * imntBudget.oInvestmentCode = this;* >>> >>> * _lInvestmentCodeBudgets.Add(imntBudget); >>> // System.NotSupportedException : Collection is read-only* >>> * }* >>> * }* >>> >>> I do not know what going on here again. >>> >>> Any suggestion? >>> >>> Best regards, >>> >>> Veasna >>> >>> >>> >>> On Monday, February 24, 2014 10:57:38 PM UTC+7, Ricardo Peres wrote: >>>> >>>> Try this: >>>> >>>> <many-to-one name="oInvestmentType" column="InvestmentTypeID" >>>> class="Tec.Core.Model.InvestmentType, Tec.Core" not-null="true" >>>> cascade="save-update" >>>> /> >>>> >>>> On Monday, February 24, 2014 11:33:12 AM UTC, Veasna MUCH wrote: >>>>> >>>>> >>>>> Good afternoon, >>>>> >>>>> I have following database schemas >>>>> >>>>> >>>>> <https://lh4.googleusercontent.com/-TnjRxHcktjM/UwscRDvMOGI/AAAAAAAABx4/_6XhBJFgic4/s1600/ER+Diagram.JPG> >>>>> Here is my mapping file >>>>> >>>>> *Airport* >>>>> ----------------------------------------------------------- >>>>> >>>>> <?xml version="1.0" encoding="utf-8" ?> >>>>>> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> >>>>>> <class name="Tec.Core.Model.Airport, Tec.Core" table="tblAirport" >>>>>> lazy="false"> >>>>>> <id name="ID" column="AirportID" unsaved-value="0"> >>>>>> <generator class="identity" /> >>>>>> </id> >>>>>> <property name="AirportCode" column="AirportCode" /> >>>>>> <property name="AirportFullName" column="AirportFullName" /> >>>>>> >>>>>> <bag name="Budgets" table="tblBudget" inverse="true" >>>>>> cascade="save-update"> >>>>>> <key column="AirportID" /> >>>>>> <one-to-many class="Tec.Core.Model.Budget, Tec.Core" /> >>>>>> </bag> >>>>>> >>>>>> </class> >>>>>> </hibernate-mapping> >>>>> >>>>> >>>>> >>>>> * public class Airport:Entity<int> * >>>>> * {* >>>>> * private string _airportCode="";* >>>>> * private string _airportFullName="";* >>>>> * private IList<Budget> _airportBudgets = new List<Budget>();* >>>>> >>>>> * private Airport() { }* >>>>> * public Airport(string AirportCode, string AirportFullName) {* >>>>> * this._airportCode = AirportCode;* >>>>> * this._airportFullName = AirportFullName; * >>>>> * }* >>>>> * public string AirportCode** {* >>>>> * get { return _airportCode; }* >>>>> * set { _airportCode = value; }* >>>>> * }* >>>>> * public string AirportFullName** {* >>>>> * get { return _airportFullName; }* >>>>> * set { _airportFullName = value; }* >>>>> * }* >>>>> * public IList<Budget> Budgets** {* >>>>> * get { return new >>>>> List<Budget>(_airportBudgets).AsReadOnly(); }* >>>>> * protected set { _airportBudgets = value; }* >>>>> * }* >>>>> * public void AddBudget(Budget air_budget)**{* >>>>> * if (air_budget != null && >>>>> !_airportBudgets.Contains(air_budget)){* >>>>> * air_budget.oAirport = this; * >>>>> * _airportBudgets.Add(air_budget);* >>>>> * }* >>>>> * }* >>>>> >>>>> * public override int GetHashCode(){* >>>>> * return (GetType().FullName + "|" + >>>>> _airportCode.GetHashCode()).GetHashCode();* >>>>> * }* >>>>> >>>>> * }* >>>>> >>>>> >>>>> >>>>> >>>>> InvestmentCode >>>>> -------------------------------------------------------------- >>>>> >>>>> <?xml version="1.0" encoding="utf-8" ?> >>>>>> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> >>>>>> <class name="Tec.Core.Model.InvestmentCode, Tec.Core" >>>>>> table="tblInvestmentCode" lazy="false"> >>>>>> <id name="ID" column="InvestmentCodeID" unsaved-value="0"> >>>>>> <generator class="identity" /> >>>>>> </id> >>>>>> <property name="InvCode" column="InvestmentCode" /> >>>>>> <property name="InvCodeNote" column="InvestmentCodeNote" /> >>>>>> >>>>>> <bag name="Budgets" table="tblBudget" inverse="true" >>>>>> cascade="save-update"> >>>>>> <key column="InvestmentCodeID" /> >>>>>> <one-to-many class="Tec.Core.Model.Budget, Tec.Core" /> >>>>>> </bag> >>>>>> >>>>>> </class> >>>>>> </hibernate-mapping> >>>>> >>>>> >>>>> >>>>> * public class InvestmentCode: Entity<int> * >>>>> * {* >>>>> >>>>> * private string _investmentCode="";* >>>>> * private string _investmentCodeNote="";* >>>>> * private IList<Budget> _lstinvestmentCodeBudgets = new >>>>> List<Budget>();* >>>>> >>>>> * private InvestmentCode() { }* >>>>> * public InvestmentCode(string investmentCode, string >>>>> InvestmentCodeNote) {* >>>>> * this._investmentCode = investmentCode;* >>>>> * this._investmentCodeNote = InvestmentCodeNote ; * >>>>> * } * >>>>> * public string InvCode {* >>>>> * get { return _investmentCode ; }* >>>>> * set { _investmentCode = value; }* >>>>> * }* >>>>> * public string InvCodeNote {* >>>>> * get { return _investmentCodeNote ; }* >>>>> * set { _investmentCodeNote = value; }* >>>>> * }* >>>>> * public IList<Budget> Budgets {* >>>>> * get { return new >>>>> List<Budget>(_lstinvestmentCodeBudgets).AsReadOnly(); }* >>>>> * protected set { _lstinvestmentCodeBudgets = value; }* >>>>> * }* >>>>> * public void AddBudget(Budget investment_code_budget) {* >>>>> * if (investment_code_budget != null && >>>>> !_lstinvestmentCodeBudgets.Contains(investment_code_budget)){* >>>>> * investment_code_budget.oInvestmentCode = this; * >>>>> * >>>>> _lstinvestmentCodeBudgets.Add(investment_code_budget);* >>>>> * }* >>>>> * } * >>>>> * public override int GetHashCode(){* >>>>> * return (GetType().FullName +"|"+ >>>>> _investmentCode.GetHashCode()).GetHashCode();* >>>>> * }* >>>>> * }* >>>>> >>>>> >>>>> InvestmentType >>>>> ------------------------------------------------------------ >>>>> ------------------- >>>>> >>>>> <?xml version="1.0" encoding="utf-8" ?> >>>>>> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> >>>>>> <class name="Tec.Core.Model.InvestmentType, Tec.Core" >>>>>> table="tblInvestmentType" lazy="false"> >>>>>> <id name="ID" column="InvestmentTypeID" unsaved-value="0"> >>>>>> <generator class="identity" /> >>>>>> </id> >>>>>> <property name="InvestmentTypeNote" column="InvestmentTypeNote" >>>>>> /> >>>>>> >>>>>> <bag name="Budgets" table="tblBudget" inverse="true" >>>>>> cascade="save-update"> >>>>>> <key column="InvestmentTypeID" /> >>>>>> <one-to-many class="Tec.Core.Model.Budget, Tec.Core" /> >>>>>> </bag> >>>>>> >>>>>> </class> >>>>>> </hibernate-mapping> >>>>> >>>>> >>>>> >>>>> * public class InvestmentType: Entity<int> **{* >>>>> >>>>> * private string _investmentTypeNote="";* >>>>> * private IList<Budget> _lstInvestmentTypeBudgets = new >>>>> List<Budget>();* >>>>> >>>>> * private InvestmentType() { }* >>>>> >>>>> * public InvestmentType(string InvestmentTypeNote){ * >>>>> * this._investmentTypeNote = InvestmentTypeNote ; * >>>>> * }* >>>>> * public string InvestmentTypeNote {* >>>>> * get { return _investmentTypeNote ; }* >>>>> * set { _investmentTypeNote = value; }* >>>>> * }* >>>>> * public IList<Budget> Budgets {* >>>>> * get { return new >>>>> List<Budget>(_lstInvestmentTypeBudgets).AsReadOnly(); }* >>>>> * protected set { _lstInvestmentTypeBudgets = value; }* >>>>> * }* >>>>> * public void AddBudget(Budget investment_type_budget) {* >>>>> * if (investment_type_budget != null && >>>>> !_lstInvestmentTypeBudgets.Contains(investment_type_budget)){* >>>>> * investment_type_budget.oInvestmentType = this; * >>>>> * >>>>> _lstInvestmentTypeBudgets.Add(investment_type_budget);* >>>>> * }* >>>>> * }* >>>>> * public override int GetHashCode(){* >>>>> * return (GetType().FullName + "|"+ >>>>> _investmentTypeNote.GetHashCode()).GetHashCode();* >>>>> * }* >>>>> * }* >>>>> >>>>> >>>>> Budget >>>>> ------------------------------------------------------------ >>>>> ------------ >>>>> >>>>> <?xml version="1.0" encoding="utf-8" ?> >>>>>> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> >>>>>> <class name="Tec.Core.Model.Budget, Tec.Core" table="tblBudget" >>>>>> lazy="false"> >>>>>> <id name="ID" column="BudgetID" unsaved-value="0"> >>>>>> <generator class="identity" /> >>>>>> </id> >>>>>> <property name="BudgetAmount" column="BudgetAmount" /> >>>>>> <property name="BudgetYear" column="BudgetYear" /> >>>>>> >>>>>> <many-to-one name="oAirport" column="AirportID" >>>>>> class="Tec.Core.Model.Airport, Tec.Core" not-null="true" /> >>>>>> <many-to-one name="oInvestmentCode" column="InvestmentCodeID" >>>>>> class="Tec.Core.Model.InvestmentCode, Tec.Core" >>>>>> not-null="true" /> >>>>>> <many-to-one name="oInvestmentType" column="InvestmentTypeID" >>>>>> class="Tec.Core.Model.InvestmentType, Tec.Core" >>>>>> not-null="true" /> >>>>>> >>>>>> </class> >>>>>> </hibernate-mapping> >>>>> >>>>> >>>>> >>>>> * public class Budget:Entity<long> * >>>>> * {* >>>>> * private float _budgetAmount;* >>>>> * private int _budgetYear;* >>>>> * private InvestmentType _investmentType;* >>>>> * private InvestmentCode _investmentCode;* >>>>> * private Airport _airport;* >>>>> >>>>> * public Budget() { }* >>>>> * public float BudgetAmount** {* >>>>> * get{return _budgetAmount; }* >>>>> * set{_budgetAmount = value;}* >>>>> * }* >>>>> * public int BudgetYear** {* >>>>> * get{return _budgetYear; }* >>>>> * set{_budgetYear = value;}* >>>>> * }* >>>>> * public Airport oAirport**{* >>>>> * get{return _airport; }* >>>>> * set{_airport = value;}* >>>>> * }* >>>>> * public InvestmentType oInvestmentType{* >>>>> * get{return _investmentType; }* >>>>> * set{_investmentType = value;}* >>>>> * }* >>>>> * public InvestmentCode oInvestmentCode {* >>>>> * get{return _investmentCode ; }* >>>>> * set{_investmentCode = value;}* >>>>> * }* >>>>> * public override int GetHashCode(){* >>>>> * return (GetType().FullName + "|" + _airport.GetHashCode() >>>>> +"|"+ _investmentCode.GetHashCode()+"|"+ >>>>> _investmentType.GetHashCode()).GetHashCode();* >>>>> * }* >>>>> >>>>> * }* >>>>> >>>>> >>>>> And in my Default.asp.cs >>>>> >>>>> I have following code : >>>>> >>>>> Airport objA = new Airport("NA", "New Airport") >>>>> InvestmentCode objIC = new InvestmentCode("1000", "ABCD"); >>>>> InvestmentType objIT = new InvestmentType("Capex"); >>>>> >>>>> Budget objBg = new Budget(); >>>>> objBg.oAirport = objA; >>>>> objBg.oInvestmentCode = objIC; >>>>> objBg.oInvestmentType = objIT; >>>>> objBg.BudgetAmount = 10000; >>>>> objBg.BudgetYear = 2014; >>>>> >>>>> objA.AddBudget(objBg); >>>>> AirportDao.SaveOrUpdate(objA); >>>>> >>>>> objIC.AddBudget(objBg); >>>>> * daoFactory.**GetInvestmentCodeDao()**.Save(*objIC*); >>>>> //Error occur here **not-null property references a null or >>>>> transient value Tec.Core.Model.Budget.oInvestmentType* >>>>> >>>>> >>>>> objIT.AddBudget(objBg); >>>>> daoFactory.GetInvestmentTypeDao().Save(objIT); >>>>> >>>>> >>>>> I have no idea what going on to these problem. I am very new to >>>>> NHibernate and would like to start using this in my development. >>>>> >>>>> Could you please guide me how to solve this problem? >>>>> >>>>> Best regards, >>>>> >>>>> Veasna >>>>> >>>>> -- > You received this message because you are subscribed to the Google Groups > "nhusers" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/nhusers. > For more options, visit https://groups.google.com/groups/opt_out. > -- You received this message because you are subscribed to the Google Groups "nhusers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/nhusers. For more options, visit https://groups.google.com/groups/opt_out.
