Как определить сущность ReadOnly в двунаправленном отношении «один ко многим» с одного конца? - PullRequest
0 голосов
/ 04 октября 2011

У меня есть следующие объекты:

public class Country{
    public virtual int Id { get; private set; }
    public virtual string Name { get; set; }
    public virtual IList<City> Cities { get; set; }
}

public class City{
    public virtual int Id { get; private set; }
    public virtual string Name { get; set; }
    public virtual Country Country {
        get { return _country; }

    }

    private readonly Country _country;
}

Но, учитывая следующий код, пользователь может сделать

  1. _country.Name = "newCountry";
  2. _country.Cities.Add (AnotherCity);
  3. _country.Cities [0] .Name = "newCity" 4._country.Cities [0] .Country.Name = "Opps"

1-3 в порядке, но мои проблемы с # 4.Существует некоторая потребность в том, чтобы я сделал это как двунаправленное отображение «один-много», но в идеале я хотел бы, чтобы ссылка на страну (включая все ее свойства) в городской единице была доступна только для чтения.Есть ли способ, которым я могу сделать это?Я попытался

public interface IReadOnlyCountry {

    int Id { get; }
    string Name { get; }
    IList<City> Cities { get; }

}

public class Country : IReadOnlyCountry{
    public virtual int Id { get; private set; }
    public virtual string Name { get; set; }
    public virtual IList<City> Cities { get; set; }
}

public class City {
        public virtual int Id { get; private set; }
        public virtual string Name { get; set; }
        public virtual IReadOnlyCountry Country {
            get { return _country; }

        }

        private readonly Country _country;
    }

Но он не работает для Nhibernate (не уверен, что я делаю что-то не так, или это невозможно).Как вы справляетесь с такими ситуациями?

1 Ответ

1 голос
/ 19 октября 2011

Учитывая, что города и страны не часто меняют названия, я бы сделал их свойства доступными только для чтения.Кроме того, рекомендуется создать метод в классе Country для добавления городов, чтобы обеспечить соблюдение отношения Country-City:

public class Country
{
    public Country(string name)
    {
        this.Name = name;

    }

    // for NHibernate
    protected Country()
    {
        this.Cities = new List<City>();
    }

    public virtual int Id { get; private set; }
    public virtual string Name { get; private set; }
    public virtual IList<City> Cities { get; private set; }

    public virtual City AddCity(string name)
    { 
        var city = new City(this, name);
        this.Cities.Add(city);
        return city;
    }
}

public class City
{
    public City(Country country, string name)
    {
        this.Country = country;
        this.Name = name;
    }

    // for NHibernate
    protected City()
    {
    }

    public virtual int Id { get; private set; }
    public virtual string Name { get; private set; }
    public virtual Country Country { get; private set; }
}

Теперь имя доступно только для чтения независимо от способа доступа к объекту.Однако, если у вас есть случай, когда вы хотели бы иметь возможность изменить название страны или города, доступ к объекту «Страна» из города является лишь одним из способов доступа к нему, и нет ничего плохого в том, что вы можете изменить имя с помощьюкод в # 4.

Однако указанный код можно заставить работать, изменив стратегию доступа по умолчанию в отображении FluentNHibernate для свойства Country объекта City, чтобы оно сохраняло значение в поле _country, а не проходило черезсвойство.

...