【问题标题】:Link two entities based on unique value not ID基于唯一值而不是 ID 链接两个实体
【发布时间】:2009-06-26 06:01:49
【问题描述】:

我有以下数据库表。主键是 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

【问题讨论】:

    标签: nhibernate domain-driven-design


    【解决方案1】:

    我会调查几个选项。

    1) 如果数据不经常变化,能不能把 AnimalType 设为 Enum 而不是 Entity Object?

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

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

    【讨论】:

    • 这是我假设的方式,我的问题特别是围绕 NHibernate 对这种情况的支持。
    • 您可以调查 Animal 映射中多对一标记上 property-ref 属性的用法。这允许您通过非 FK 列引用另一个表。虽然如果数据不会改变,那么使用枚举会好得多。
    猜你喜欢
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    • 2016-06-24
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多