根据唯一值而不是ID链接两个实体

时间:2009-06-26 06:01:49

标签: nhibernate domain-driven-design

我有以下数据库表。主键是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中使用以下代码,以便它引用 Herbivore 的相同AnimalType?

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

更新

如果我能让NHibernate执行这个逻辑,那就太好了:http://andreas.scherbaum.la/blog/archives/11-Avoid-Unique-Key-violation.html

1 个答案:

答案 0 :(得分:1)

我会调查几个选项。

1)如果数据不经常更改,您可以将AnimalType设为枚举而不是实体对象吗?

2)使用animalTypeRepository.FindByType("Herbivore")实例化Herbivore AnimalType的对象,并将该对象传递给新动物。

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