ORMers,您将如何以ORM风格处理这个问题?

时间:2010-03-10 03:54:04

标签: orm relationship

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

我们只更改了标记部分,删除了tag1tag2并添加了tag3tag4

按下发布问题按钮后,应该完成以下操作:

  1. count的{​​{1}}列,tag1减少了1
  2. 删除帖子与tag2tag1
  3. 之间的关系
  4. 如果tag2tag3已存在,请将两个tag4列增加1;否则,将count表格中的tags表格添加count价值1
  5. 添加帖子与tag3tag4
  6. 之间的关系

    让我们深呼吸,这就是全部!

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

1 个答案:

答案 0 :(得分: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();
}