【问题标题】:ORMers,how are you going to deal with this in the ORM style?ORM 们,你打算如何以 ORM 风格处理这个问题?
【发布时间】:2010-03-10 03:54:04
【问题描述】:

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

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

按下发布您的问题按钮后,应该做这些事情:

  1. tag1,tag2count 列减少了1
  2. 删除帖子与tag1,tag2的关系
  3. 如果tag3,tag4已经存在,则将两者的count列加1;否则,将它们插入tags表,count值为1
  4. 添加帖子与tag3,tag4的关系

让我们深呼吸,仅此而已!

我想看看哪种 ORM 可以最容易/最高效地实现这一点,无论它是用 PHP/Java/C/.Net 还是其他任何语言编写的,因为跨语言的想法是相似的!

【问题讨论】:

  • 我们到底想比较什么?商业模式声明?真实的业务方法或手动分配的属性并调用 Persist() 方法?

标签: orm relationship


【解决方案1】:

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

【讨论】:

  • 所以它会使用比纯(非 ORM)过程编程更多的查询?
  • 请参阅这篇文章了解我所说的非 ORM 解决方案,它只需要两个查询即可查询多个标签:stackoverflow.com/questions/2392827/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多