2010-03-24 2 views
1

Я создаю приложение NHibenate с отношением друг к другу. Как данные города и штата. City таблицаFluent NHibernate Много к одному сопоставление

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) 

Мое отображение следует

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() 
} 

Модели следующим образом:

[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 код ниже.

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); 

Проблема в том, что я не могу вставить запись. Ошибка ниже.

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

Но ошибка не возникает, если я комментирую поле отображения State_id в файле CityMapping. Я не знаю, какую ошибку я сделал. Если не дать отображение Карта (x => x.State_id); значение этого поля равно нулевому значению. Пожалуйста, помогите мне, как решить эту проблему.

ответ

1

Несколько замечаний:

  1. State_id Снимите это свойство от City класса и отображения. У вас уже есть свойство State, поэтому оно не имеет смысла в вашей объектной модели.

  2. Тех Jobs и EmployeePreferedLocations свойства в State классе не имеет какие-либо связанные столбцы/таблиц в базе данных (по крайней мере, один вы показали здесь), а у вас есть отображения для них.

+2

Пункт №1 является основной причиной ошибки: state_id отображается дважды в одном классе. –

+0

Hi Jamie/Darin Если я не помещаю sate_Id в таблицу City, то как я могу получить state_id, когда я беру таблицу города? Я не хочу получать таблицу состояний, пока я беру таблицу города. – Jit

+0

Предполагая, что у вас есть город, вы можете перемещаться по ассоциации: 'city.State.StateId'. –