ORMers, как вы собираетесь иметь дело с этим в стиле ORM? - PullRequest
1 голос
/ 10 марта 2010

Мы изменяем наш пост на stackoverflow.

И мы только изменили теги часть, удалили tag1, tag2 и добавили tag3, tag4.

После нажатия кнопки Post Your Question необходимо выполнить следующие действия:

  1. уменьшил столбец count для tag1, tag2 на 1
  2. удалить связь между постом и tag1, tag2
  3. , если tag3, tag4 уже существует, увеличьте столбец count обоих на 1, в противном случае вставьте их в таблицу tags со значением count 1
  4. добавить отношение между постом и tag3, tag4

Давайте сделаем глубокий вдох и все!

Я хочу посмотреть, какой ORM может подойти к этому наиболее легко / производительно, независимо от того, написано ли это на PHP / Java / C / .Net или на любом другом языке, потому что идеи схожи между языками!

1 Ответ

0 голосов
/ 10 марта 2010

В DataObjects.Net это будет выглядеть так. Теперь есть все файлы сопоставления, потому что схема базы данных автоматически генерируется ORM, включая вспомогательную таблицу для отношения вопрос-тег.

Класс метки:

[HierachyRoot]
public class Tag : Entity
{
  [Field, Key]
  public int Id { get; private set; }

  [Field(Length = 100, Indexed = true)]
  public string Name { get; private set; }

  [Field]
  public int QuestionsCount { get; set; }

  public Tag(string name) 
  {
    Name = name;
  }
}

Класс вопроса:

[HierachyRoot]
public class Question : Entity
{
  [Field, Key]
  public int Id { get; private set; }

  [Field]
  public EntitySet<Tag> Tags { get; private set; }

  // Business methods (can be placed in separate service class)

  public void AddTag(string name)
  {
    var tag = Query.All<Tag>().SingleOrDefault(t => t.Name == name);
    if (tag==null)
      tag = new Tag(name) { QuestionsCount = 1 }
    else
      tag.QuestionsCount++;
    Tags.Add(tag);
  }

  public void RemoveTag(string name)
  {
    var tag = Query.All<Tag>.Single(t => t.Name == name);
    tag.QuestionsCount--;
    Tags.Remove(tag);
  }
}

Код приложения:

using (Session.Open())
using (var transactionScope = Transaction.Open())
{
  var question = Query.Single<Question>(questionId);

  question.RemoveTag("tag1");
  question.RemoveTag("tag2");

  question.AddTag("tag3");
  question.AddTag("tag4");

  transactionScope.Complete();
}
...