0

2 つのテーブルがArticlesありEvents、両方のタイプのユーザーにコメント機能を提供したいと考えています。難しいのは、特定の EF オブジェクトに属するコメントを返すナビゲーション プロパティを使用したいということです。

public class Article
{
    public virtual ICollection<Comment> Comments { get; set; }
    /* more properties here */
}

public class Event
{
    public virtual ICollection<Comment> Comments { get; set; }
    /* more properties here */
}

public class Comment
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CommentId { get; set; }
    public string Msg { get; set; }
    public DateTime SentAt { get; set; }

    public int TargetId { get; set; }
    public CommentTargeType TargetType { get; set; }
}

public enum CommentTargeType
{
    Article,
    Event
}

ご覧のとおり、 はまたは のTargetIdID であり、はこれら 2 つのタイプを区別するためのものです。それで、これを行う方法はありますか?それとも、代わりに ArticleComments と EventComments タイプを作成したほうがよいでしょうか?ArticleEventTargetType

4

1 に答える 1

1

現在の設計では、基本的にオブジェクト内の同じフィールドを使用して、2 つのテーブルへの外部キーを作成しています。データベースは制約を強制したり、整合性チェックを実行したりできないため、これはお勧めしません。

ArticleId と EventId という2 つのint?フィールドを追加して、目的を達成できます。タイプはint?であるため、データベースでは null 許容フィールドになります。

さらに一歩進んでForeignKey属性を使用し、EntityFramework がこれを認識して外部キーを作成できるようにします。

[ForeignKey("Article")]
public int? ArticleId { ... }
public virtual Article Article { get; set; }

[ForeignKey("Event")]
public int? EventId { get; set; }
public virtual Event Event { get; set; }
于 2013-02-22T18:03:55.470 に答える