Fluent NHibernate Many to one mapping

Posted by Jit on Stack Overflow See other posts from Stack Overflow or by Jit
Published on 2010-03-24T22:01:36Z Indexed on 2010/03/24 22:03 UTC
Read the original article Hit count: 359

Filed under:
|

I am creating a NHibenate application with one to many relationship. Like City and State data. City table

CREATE TABLE [dbo].[State](
 [StateId] [varchar](2)  NOT NULL primary key,
 [StateName] [varchar](20) NULL)
CREATE TABLE [dbo].[City](
 [Id] [int] primary  key IDENTITY(1,1) NOT NULL ,
 [State_id] [varchar](2)  NULL refrences State(StateId),
 [CityName] [varchar](50)  NULL)

My mapping is follows

  public CityMapping()

{ Id(x => x.Id); Map(x => x.State_id); Map(x => x.CityName); HasMany(x => x.EmployeePreferedLocations) .Inverse() .Cascade.SaveUpdate() ; References(x => x.State) //.Cascade.All(); //.Class(typeof(State)) //.Not.Nullable() .Cascade.None()
.Column("State_id") ; }

public StateMapping()
  {
            Id(x => x.StateId)
                .GeneratedBy.Assigned();
   Map(x => x.StateName);
            HasMany(x => x.Jobs)
                 .Inverse();
                //.Cascade.SaveUpdate();
            HasMany(x => x.EmployeePreferedLocations)
                 .Inverse();

   HasMany(x => x.Cities)
                 // .Inverse()
                .Cascade.SaveUpdate()
                //.Not.LazyLoad()
                ;
  }

Models are as follows:

[Serializable]
 public partial class City
 {
  public virtual System.String CityName { get; set; }
  public virtual System.Int32 Id { get; set; }
  public virtual System.String State_id { get; set; }
  public virtual IList<EmployeePreferedLocation> EmployeePreferedLocations { get; set; }
        public virtual JobPortal.Data.Domain.Model.State State { get; set; }


        public City(){}

 }

public partial class State
 {
  public virtual System.String StateId { get; set; }
  public virtual System.String StateName { get; set; }
  public virtual IList<City> Cities { get; set; }
  public virtual IList<EmployeePreferedLocation> EmployeePreferedLocations { get; set; }
  public virtual IList<Job> Jobs { get; set; }

        public State()
        {
            Cities = new List<City>();
           EmployeePreferedLocations = new List<EmployeePreferedLocation>();
           Jobs = new List<Job>();
        }

        //public virtual void AddCity(City city)
        //{
        //    city.State = this;
        //    Cities.Add(city);

        //}

 }

My Unit Testing code is below.

City city = new City();

                IRepository<State> rState = new Repository<State>();
                Dictionary<string, string> critetia = new Dictionary<string, string>();
                critetia.Add("StateId", "TX");
                State frState = rState.GetByCriteria(critetia);

                city.CityName = "Waco";
                city.State = frState;

                IRepository<City> rCity = new Repository<City>();


                rCity.SaveOrUpdate(city);

                City frCity = rCity.GetById(city.Id);

The problem is , I am not able to insert record. The error is below.

"Invalid index 2 for this SqlParameterCollection with Count=2."

But the error will not come if I comment State_id mapping field in the CityMapping file. I donot know what mistake is I did. If do not give the mapping Map(x => x.State_id); the value of this field is null, which is desired. Please help me how to solve this issue.

© Stack Overflow or respective owner

Related posts about fluent

Related posts about nhibernate