1

stackoverflow の投稿を修正しています。

そして、タグ部分のみを変更し、 を削除tag1し、tag2を追加しましtag3tag4

[質問を投稿] ボタンを押した後、次のことを行う必要があります。

  1. countの列をtag11tag2減らしました
  2. tag1ポスト との関係を削除します。tag2
  3. tag3tag4既に存在する場合countは、2 つの列を 1 増やします。そうでない場合は、それらを値 1でtagsテーブルに挿入しますcount
  4. ポストとの関係を追加しtag3tag4

深呼吸しましょう、それだけです!

PHP/Java/C/.Net またはその他の言語で記述されている場合でも、どの ORM がこれに最も簡単に/効率的にアプローチできるかを確認したいと思います。アイデアは言語間で類似しているためです!

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 に答える