【问题标题】:dilemma on the use of inheritance in EF code-first在 EF 代码优先中使用继承的困境
【发布时间】:2015-04-24 01:19:08
【问题描述】:

我正在尝试在我的应用程序中实现Like 功能(类似于 Facebook)。我将有三种类型的Likes:对帖子的点赞、对 cme​​ts 的点赞(对帖子)和对回复的点赞(对 cme​​ts)。后来,我想根据like的活动为用户生成一个动态的通知列表。

对于这个任务,我认为继承会很好用,所以我有以下类(Like 是基类)

Like : LikeId, LikeDate, WhoLiked, WhoseLiked, IsNotificationRead

PostLike: PostId

CommentLike: CommentId

ReplyLike:ReplyId

我需要生成一个通知列表,如下所示:

  1. 用户 1 喜欢您的帖子(PostId 应该附加到此项目

  2. 用户 2 喜欢您的评论(CommentId 应该附加到此) 项目)

  3. User3 喜欢您的回复(ReplyId 应该附加到此项目)

但是,过去 2 天我很难生成此输出。最后,我得出结论,我不能在单个 LINQ 语句中使用 dbcontext.Likes 来获得此输出。

我打算为每个继承的实体单独生成列表,并在最后合并所有列表:

  var postlikes = db.Like.OfType<PostLike>().Select(a => 
         new {Text = "User1 liked your post", ItemId=a.PostId, Type="Post"});

  var commentlikes = db.Like.OfType<CommentLike>().Select(a => 
         new {Text = "User1 liked your comment", ItemId=a.CommentId, Type="Comment"});

  var replylikes = db.Like.OfType<ReplyLike>().Select(a => 
         new {Text = "User1 liked your reply", ItemId=a.ReplyId, Type="Reply"});

您认为我实现继承的方式在这种情况下有意义吗?你推荐另一种方法吗?你觉得我这里需要继承吗?

谢谢

【问题讨论】:

  • 如果你想通知用户,最好有一个 UserNotification 对象,它可以独立于通知的来源(新的喜欢,新的评论等),这样您有一个很好的界面,可以在添加功能时添加新的通知类型。这个对象可以包含一个接口的实例(例如 INotifiable),它链接回适当的对象。

标签: c# linq entity-framework inheritance


【解决方案1】:

除非您的示例中省略了其他成员,否则您的方法似乎有点过头了。加上做 3 个查询只是为了获得喜欢的通知似乎很重。

一个简单的实现是拥有一个具有TargetIdTargetType 属性的Like 类,然后根据TargetType 的值调整文本。您不会以这种方式获得导航属性,但您可能不需要它们。

如果您希望继承的类像您的示例一样,至少要重构以便您只访问数据库一次:

var likes = db.Like.ToList();

var postLikes = likes.OfType<CommentLike>()...

【讨论】:

  • 你的意思是,我可以只拥有一个没有导航属性的 Like 类(CommentPostReply)但仍然具有相关属性(TargetId、@987654331 @) 做我想做的事?
  • TargetId 将只是 PostIdCommentIdReplyId 的值,并且不会配置为外键。 TargetType 的值会告诉您喜欢的对象类型,因此您可以使用 id 创建指向相应条目的链接。希望这是有道理的
猜你喜欢
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多