如何将数据从 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】:
要添加User
和Review
之间的关系,您只是缺少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
对象(必须附加到上下文中)或将评论添加到附加的User
的Reviews
集合中。与仅设置外键相比相当麻烦。所以我同意添加这个UserId
属性,但解释不是100% 正确的。对于工作关系而言,这不是必需的。
@GertArnold 是的,这对我来说解释得更好。所以我可以实施,但实际上更多的工作没有好处?其他答案让我感到困惑,因为我知道这是可能的,但还需要解释为什么它不是可取的。以上是关于如何将数据从 DTO 映射到导航属性?的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 OData、EF Core 和 AutoMapper 映射 List<> 导航属性
Entity Framework 4 - 数据透视表和导航属性