asp.net mvc 4-C#复杂属性设置器选项

本文关键字:设置 选项 属性 复杂 net mvc 4-C# asp | 更新日期: 2023-09-27 17:59:06

我有一个ASP.Net MVC 5(C#)应用程序,我让我的用户能够喜欢帖子和评论。

为此,我有一个名为Likes的模型,具有以下属性:

public class Like
{
    public Like()
    {
        this.CreatedUTC = System.DateTime.UtcNow;
        this.isActive = true;
    }
    public long id { get; set; }
    public string UserID { get; set; }
    public bool isActive { get; set; }
    public LikeType Type { get; set; }
    public DateTime CreatedUTC { get; set; }  
}

Type是一个枚举,它可以是CommentsPosts。我还将以下导航属性添加到Post Model和Comment Model中:

public virtual ICollection<Like> Likes { get; set; }

我的问题是,我能在上面的代码行中有一个setter函数吗?它会自动为Like类型设置CommentsPosts?我知道我可以在Setter中使用Value变量,但使用Google时,我找不到如何将其用于上面提到的复杂类型(Like)。

我相信这将是一种更好的方式来做到这一点,而不是在存储库中手动设置枚举,每次我要保存一个赞。

更新:

看到我们如何就这个问题展开一场愉快的小对话,我将在组合中加入另一种选择。

两个基类为Like的表怎么样,一个CommentLikes,另一个PostLikes看到这个表的大小会增长得很快,我想把它们分开可能是件好事,对吧?

asp.net mvc 4-C#复杂属性设置器选项

我宁愿去掉"LikeType",要么在Like实体中有Comment和Post实体,并通过其中一个为空来区分,要么引入两个新实体

public class CommentLike
{
    public Comment Comment { get; set; }
    public Like Like { get; set; }
}

其持有评论和点赞,以及持有帖子和点赞的PostLike。评论看起来像这个

public Comment
{
    public virtual ICollection<CommentLike> { get; set; }
}

另一种选择是为评论和帖子点赞创建单独的表格。虽然您所要求的肯定是可行的,但我建议使用更详细但更简单的解决方案,这将使代码更易于维护,错误更少。您想要拥有LikeType属性的具体原因是什么?

我遇到了同样的问题,但并没有遇到简单的方法。

class Post{
   public virtual ICollection<Like> Likes {set;get;}
}
class Comment{
   public virtual ICollection<Like> Likes {set;get;}
}
Then:
class Like{
  //....
}

你不需要双向关系。您是否有需要查询Likes表的情况?如果你这样做了,你将不得不把它解析为ENUM,这可能是一种扩展方法。

EF将在您的表格设计中创建Post_Id和Comment_Id。你不能查询它,但你不需要。根据我的经验,我从来没有需要过。

我的问题是,我能在上面的代码行中有一个setter函数吗在那里它会自动为"赞"类型设置"评论和帖子"?

我假设您使用的是T4模板,或者EF生成的类是partial,那么您可以通过为Likes 创建另一个分部类和wrapper property来扩展它

// Backing field
private ICollection<Like> _likesWrapper;
public ICollection<Like> LikesWrapper { 
get { 
  // Lazy loading
 if(_likes == null)
 { 
   // Just create a new list or load it from the database.
   _likes = new List<Like>(); 
 }
 return _likes; 
 }
set { 
 foreach(var val in value)
 {
   //Set the comment and posts
 }
 Likes = value;
}