我有两个表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
}
如您所见,TargetId
将是Article
或Event
的ID,而TargetType
则是区分这两种类型。
那么,有没有办法做到这一点?或者更好的是创建一个ArticleComments和一个EventComments类型?
答案 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; }