2013-02-22 104 views
0

我有两个表ArticlesEvents,我想为这两种类型的用户提供评论功能。难的部分是我想使用导航属性返回属于给定EF对象的注释。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会的ArticleEventTargetType的ID来区分这两种类型。 那么,有没有办法做到这一点?或者创建一个ArticleComments和一个EventComments类型会更好吗?

+0

你有什么工作,你只需要小心你的阅读,并写道TargetType是正确的。 – 2013-02-22 18:02:39

回答

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; } 
+0

“数据库将无法强制任何约束或进行完整性检查” - 这是一个很好的见解 – tuta4 2013-02-22 18:26:50