2009-06-26 1 views
2

次のデータベーステーブルがあります。主キーはIDで、AnimalType.Typeは一意の文字列です。IDなしのユニークな値に基づいて2つのエンティティをリンクします。

Animal 
- ID 
- Name 
- TypeID 

AnimalType 
- ID 
- Type [Herbivore, Carnivore] 

私のクラスは以下の通りです。

public class Animal 
{ 
    public int ID { get; private set; } 

    public string Name { get; set; } 

    public AnimalType Type { get; set; } 
} 

public class AnimalType 
{ 
    private int ID { get; set; } 

    public string Type { get; set; } 
} 

どのように私はそれが草食動物の同じAnimalTypeを参照するように、次のコードは、NHibernateはで動作するようになるだろうか?

var horse = new Animal() { Name = "Horse", Type = new AnimalType() { "Herbivore" }}; 

repository.SaveOrUpdate(horse); 

var rabbit = new Animal() { Name = "Rabbit", Type = new AnimalType() { "Herbivore" } }; 

repository.SaveOrUpdate(rabbit); 

UPDATE

私はNHibernateのは、このロジックを実行するために得ることができればいいです:http://andreas.scherbaum.la/blog/archives/11-Avoid-Unique-Key-violation.html

答えて

1

私はいくつかのオプションを検討したいです。

1)データが頻繁に変更されない場合、AnimalTypeをエンティティオブジェクトではなくEnumにすることはできますか?

2)animalTypeRepository.FindByType("Herbivore")を使用してHerbivore AnimalTypeのオブジェクトをインスタンス化し、そのオブジェクトを新しいAnimalに渡します。あなたが持っているだろうように

3)私の質問は、特にこのためNHibernateの内サポートの周りにある、

public class AnimalRepository 
{ 
    public void SaveOrUpdate(Animal animal) 
    { 
    var animalType = animal.Type; 
    if (animalType.ID == 0) 
    { 
     animal.Type = animalTypeRepository.Find(animalType.Type); 
    } 

    // save or update animal... 
    } 
} 
+0

これは私がそれを行うことになると想定方法がある... animalRepository.SaveOrUpdate(animal)方法に上記のロジックを移動しますシナリオ。 – bleevo

+0

Animalマッピング内のmany-to-oneタグでproperty-ref属性の使用方法を調べることができます。これにより、非FK列で別の表を参照することができます。データが変更されない場合は、列挙型を使用する方がはるかに優れています。 – Nigel

関連する問題