【问题标题】:How do I map data from a DTO to a navigational property?如何将数据从 DTO 映射到导航属性?
【发布时间】:2021-11-19 01:50:57
【问题描述】:

我有两个模型,用户和评论,它们具有一对多的关系。我正在使用 DTO 在我的控制器中创建新评论。评论被添加到电影模型上的评论类型的 ICollection 中(电影和评论也有一对多的关系)。这是来自我的控制器的 sn-p:

var query = db.Movies.Where(i => i.id == reviewDTO.movieId).FirstOrDefault();
            Review review = new Review()
            {
                goreRating = reviewDTO.goreRating,
                shockRating = reviewDTO.shockRating,
                jumpRating = reviewDTO.jumpRating,
                plotRating = reviewDTO.plotRating,
                supernaturalRating = reviewDTO.supernaturalRating,
                description = reviewDTO.description,
                isSpoiler = reviewDTO.isSpoiler
            };
            try
            {

                query.Reviews.Add(review);
            }

还有模特:

public class User
{
    public int id { get; set; }
    public string Username { get; set; }

    public virtual ICollection<Review> Reviews { get; set; }
}

public class Review
    {
        public int id { get; set; }
        public virtual Movie Movie { get; set; }
        public virtual User User { get; set; }

        public int goreRating { get; set; }
        public int shockRating { get; set; }
        public int jumpRating { get; set; }
        public int plotRating { get; set; }
        public int supernaturalRating { get; set; }
        public string description { get; set; }
        public bool isSpoiler { get; set; }

    }

如何使用实体框架在控制器中添加关系并为每个评论设置外键 userId?

【问题讨论】:

  • “我如何在控制器中添加关系”你能解释一下它的含义吗?控制器在哪里?
  • 我认为Review 只需要UserId (int) 作为属于其User 属性的外键属性。
  • 你需要正确定义关系。
  • @Serge 我的意思是,在我使用实体框架定义关系之后,我如何检索和存储这个关系?控制器的一部分包含在问题中,完整的不是因为我不确定它是否全部相关并且那里有很多代码。
  • @GertArnold 我以为实体框架会自动管理这个?我了解它通常是如何工作的,但我想始终如一地使用 EF 的导航属性来实现这一点

标签: asp.net-mvc entity-framework .net-core model-view-controller entity-framework-core


【解决方案1】:

要添加UserReview 之间的关系,您只是缺少Review 中的UserId

public class Review
    {
....
        public int UserId { get; set; } // Add this to review model
....
    }

要获得用户的所有评论,您可以编写使用这种 LINQ 查询

var data = _context.User.Where(x => ...any condition here...).Include(x => x.Reviews )

【讨论】:

  • 我认为使用 Entity Framework 这个 UserId 会自动添加到表中,因为有一个导航属性?
  • 如果你明确需要UserId而不使用Include,那么你需要添加这个属性。
  • 我明白了。在这种情况下我将如何使用包含?
  • 那么你需要添加这个属性 那不正确,可以只使用引用属性,也可以使用Include(为什么不呢?)。但是您必须设置一个User 对象(必须附加到上下文中)或将评论添加到附加的UserReviews 集合中。与仅设置外键相比相当麻烦。所以我同意添加这个UserId 属性,但解释不是100% 正确的。对于工作关系而言,这不是必需的
  • @GertArnold 是的,这对我来说解释得更好。所以我可以实施,但实际上更多的工作没有好处?其他答案让我感到困惑,因为我知道这是可能的,但还需要解释为什么它不是可取的。
猜你喜欢
  • 1970-01-01
  • 2011-01-05
  • 2019-08-18
  • 2019-09-26
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多