1

我们正在修改我们在 stackoverflow 上的帖子。

而且我们只更改了标签tag1部分,删除tag2并添加了tag3, tag4

按下“发布您的问题”按钮后,应完成以下操作:

  1. 将的count列减少1tag1tag2
  2. 删除帖子和 之间的关系tag1tag2
  3. 如果tag3,tag4已经存在,count则将两者的列加 1;否则,将它们插入到值为 1的tags表中count
  4. 添加帖子和之间的关系tag3tag4

让我们深吸一口气,仅此而已!

我想看看哪个 ORM 可以最容易/最高效地处理这个问题,无论它是用 PHP/Java/C/.Net 还是其他任何语言编写的,因为这些想法在不同语言中都是相似的!

4

1 回答 1

0

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();
}
于 2010-03-10T08:19:01.410 回答