0

したがって、私のデータベースは次のようになります。

Comment -> Commentable 

Commentable -> News
Commentable -> Files
Commentable -> Photo

つまり、新しいエンティティ (ファイルまたは写真) を追加するときに、新しい Commentable を追加して、この値をエンティティに挿入する必要があります。

これのベストプラクティスは何ですか? エンティティの作成機能をオーバーライドするか、リポジトリの追加機能に入れる必要がありますか?

テーブルの構造はそのように見えます。bcz エンティティごとに独自のコメント テーブルを作成する必要はありません。

編集:私のテーブル スキーマは次のようになります: Branko Dimitrijevic の投稿の 1 つのテーブルと複数のテーブル

新しいファイルまたはイベントを追加したい場合-最初に、新しい「コメント可能な」行を生成する必要があり、その後のみ-エンティティを関連付けて追加します。

それで、私の質問は、このロジックをどこに配置する必要があるか、または最も正しい方法でそれを行う方法ですか?

どうも。

4

3 に答える 3

1

写真、ニュース、およびファイル テーブルの設計については、慎重に検討してください。最初の Stackoverflow の質問を投稿したとき、同様の問題について考えていました:データベース設計 - 記事、ブログ投稿、写真、ストーリー

Articles、Photos、Videos、Documents、BlogPosts はすべて、Author、ReleaseDate、Title、Description、Keywords などのいくつかの共通フィールドを共有していることに気付きました。そこで、EF の型継承機能を使用してテーブルのスーパータイプ/サブタイプ階層を作成し、これをモデル化しました。次に、コメントは 1 つのスーパータイプ talbe (Publications と名付けました) への外部キーのみを持ちます。ほとんどの場合、これは私にとって非常にうまく機能しています。

EF の継承を使用する場合は注意してください: Table-per-type (TPT) と Table-per-heirarchy (TPH) の 2 つのバリアントがあり、それぞれに問題があります。

TPT : 共通フィールド用のスーパー テーブルと、各サブタイプのプロパティ用の個別の DB テーブルを提供します。スーパータイプに対してクエリを実行すると、パフォーマンスの問題が発生します (深刻な場合もあります)。回避策は、スーパータイプ テーブルを別のエンティティとして参照するビューを作成することです (これは私が行ったことです)。

TPH : パフォーマンスの問題はありませんが、ソリューションは基本的に階層を 1 つのテーブルにフラット化します。DBA と DB 純粋主義者は、あなたがこれを行うのを本当に好まないことがわかりました。

于 2012-10-17T19:36:05.860 に答える
0

あなたが達成しようとしていることの「公式」用語を知ることはおそらく助けになるでしょう、それであなたはさらなる研究をすることができるかもしれません。多形関連です。一般的にアンチパターンと見なされることに注意してください。私はかつてStackOverflowでそれらについて質問しましたが、その最初の画像がそれを実装する方法かもしれません。

ここに画像の説明を入力してください

これは、とにかくそれを使用する場合にこのアンチパターンを実装する方法に関するビル・カーウィンの推奨によるものです(私自身と同じように、私にとっては単なるパターンです)。

実際、これはFaustのTPTソリューション(それが機能する場合は回答として受け入れる必要があります)に似ています。特に、3つのクラスに共通するすべてのプロパティを使用してベーステーブルを拡張する場合はそうです。

この場合、リポジトリAdd関数で処理することをお勧めします。リポジトリ関数では、追加するエンティティに対してコメントオブジェクトが作成されます。

于 2012-10-18T08:25:54.643 に答える
0

その必要はありません。正しいモデル構造があれば、EF はそれを行います。

public class Comment
{
  public int ID { set;get;}  
  public string Author { set;get;}
  public IEnumrable<CommentContent> CommentContents
}
public class CommentContent
{
  public int ID { set;get;}  
  public string Photo { set;get;}
  public string News{ set;get;}
  public int CommentID { set;get;}
}

モデルにプロパティ (子を含む) を設定し、SaveChanges を実行すると、EF が子テーブルに親 ID を設定します。

var model=new Comment();
model.Author="Scott";
model.CommentContents.Add(new CommentContent
                                 { Photo="abc.jpg", News="Some content"});
model.CommentContents.Add(new CommentContent
                                 { Photo="abc3.jpg", News="Some content2"});
yourDbContext.Comments.Add(model);
yourDbContext.SaveChanges();
于 2012-10-17T18:59:35.123 に答える