如何将数据从 DTO 映射到导航属性?

Posted

技术标签:

【中文标题】如何将数据从 DTO 映射到导航属性?【英文标题】:How do I map data from a DTO to a navigational property? 【发布时间】: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 的导航属性来实现这一点 【参考方案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 是的,这对我来说解释得更好。所以我可以实施,但实际上更多的工作没有好处?其他答案让我感到困惑,因为我知道这是可能的,但还需要解释为什么它不是可取的。

以上是关于如何将数据从 DTO 映射到导航属性?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 OData、EF Core 和 AutoMapper 映射 List<> 导航属性

将验证属性从域实体映射到 DTO

Entity Framework 4 - 数据透视表和导航属性

如何将 Grails 域类映射到 DTO?

如何使用 AutoMapper 将 json 请求 dto 中的 OData 枚举字符串映射到实体枚举属性

数据类型映射:从当前元素导航到父元素名称