Связать два объекта на основе уникального значения, а не ID - PullRequest
2 голосов
/ 26 июня 2009

У меня есть следующие таблицы базы данных. Первичные ключи - это ID, а AnimalType.Type - уникальная строка.

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

Как заставить следующий код работать в NHibernate, чтобы он ссылался на тот же AnimalType Herbivore ?

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 голос
/ 26 июня 2009

Я бы исследовал несколько вариантов.

1) Если данные не часто меняются, можете ли вы сделать AnimalType Enum вместо объекта Entity?

2) Создайте объект типа Herbivore AnimalType, используя animalTypeRepository.FindByType("Herbivore"), и передайте этот объект вашему новому животному.

3) Переместите указанную выше логику в метод animalRepository.SaveOrUpdate(animal), чтобы у вас было ...

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...
  }
}
...