1


1

ORMers、これをORMスタイルでどのように扱いますか?

stackoverflowの投稿を変更しています。

そして、* tags *部分のみを変更し、 tag1、` tag2`を削除し、 tag3、` tag4`を追加しました。

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

  1. tag1、` tag2`の `count`列を1減らしました

  2. 投稿と「tag1」、「tag2」の関係を削除します

  3. tag3、` tag4`が既に存在する場合、2つの `count`列を増やします それ以外の場合、「count」値1で「tags」テーブルに挿入します

  4. 投稿と tag3、` tag4`の関係を追加します

深呼吸してみましょう、それがすべてです!

PHP / Java / C / .Netまたは他の言語で書かれていても、どのORMがこれに最も簡単に/パフォーマンスに近づくことができるかを知りたいのです。

1 Answer


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 Tags { get; private set; }

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

  public void AddTag(string name)
  {
    var tag = Query.All().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.Single(t => t.Name == name);
    tag.QuestionsCount--;
    Tags.Remove(tag);
  }
}

アプリケーションコード:

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

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

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

  transactionScope.Complete();
}