EF代码优先和虚拟属性

时间:2013-02-22 17:54:53

标签: c# asp.net ef-code-first entity-framework-5

我有两个表ArticlesEvents,我想为两种类型的用户提供评论功能。困难的部分是我想使用一个导航属性来返回属于给定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
}

如您所见,TargetId将是ArticleEvent的ID,而TargetType则是区分这两种类型。 那么,有没有办法做到这一点?或者更好的是创建一个ArticleComments和一个EventComments类型?

1 个答案:

答案 0 :(得分:1)

您当前的设计实际上是使用对象中的相同字段作为2个表中的外键。我建议反对,因为数据库将无法强制任何约束或进行完整性检查。

您可以添加两个int?字段,一个名为ArticleId,另一个名为EventId,以完成您想要的任务。由于类型为int?,因此它们将成为数据库中可为空的字段。

我甚至会更进一步使用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; }