2011-10-04 10 views
0

私は以下の団体を持っています。片方向から一対多の関係でReadOnlyエンティティを定義する方法はありますか?

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 = "中にエラー"

1-3はOKですが、私の問題がでています#4。私は、これを双方向の1対多のマッピングにする必要がありますが、市のエンティティの国(すべてのプロパティを含む)の参照は読み取り専用であることが理想です。私はそれができる方法はありますか? (私は何か間違ったことをやっているかどうかわからない、またはこれが不可能である)私は

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

なぜあなたは2つのエンティティ(国とCountryInfo)を作成せず、両方ともNHibernate ..を使用してマップされ、都市のフィールドのタイプとしてCountryInfoを使用します –

+0

試しました。うまく動作します。私は国がReadOnlyCountryに機能性を追加していると思っていました。したがって、ReadOnlyCountryをBase型にすることは意味があります。 –

答えて

1

都市や国が頻繁に名前を変更しないことを考えれば、私はそのプロパティを読み取り専用にします。また、国・市の関係が適用されるように都市を追加するための国別クラスのメソッドを作成することをお勧めし:

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のコード。

ただし、CityエンティティのCountryプロパティのFluentNHibernateマッピングのデフォルトのアクセス戦略を変更して、プロパティを通過するのではなく、国のフィールドに値を格納するように設定することができます。

+0

あなたの返信eulerfxをありがとう。私は本当に私のコードを動作させることに興味があります。カントはフィールドにアクセス戦略を設定するためのまともなドキュメントを見つけることができないようです。 :( –

+0

私はこれを見つけましたhttp://stackoverflow.com/questions/672032/fluent-nhibernate-working-with-interfaces/2114087#2114087非常に役に立ちました。 –

関連する問題