【发布时间】:2021-09-16 10:15:02
【问题描述】:
我有一个Product 数据集和评论。产品实体有 ICollection 的评论。
当有人在评论一个产品时,我想检查他之前是否已经评论过这个产品,因为如果没有接受评论,我会以某种方式收到错误。
这是我的Product 实体:
public Guid Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public double Price { get; set; }
public string Category { get; set; }
public string Condition { get; set; }
public DateTime publishDate { get; set; }
public ICollection<ProductPurchaser> Purchasers { get; set; } = new List<ProductPurchaser>();
public ICollection<Review> Reviews { get; set; }
public ICollection<ProductPhoto> Photos { get; set; }
public double ReviewsAverage { get; set; }
在这里,我正在尝试接受产品+评论并进行检查:
var product = await _context.Products
.Include(r => r.Reviews)
.FirstOrDefaultAsync(x => x.Id == request.ProductId);
if (product == null)
{
return null;
}
var user = await _context.Users
.Include(p => p.Photos)
.SingleOrDefaultAsync(x => x.UserName == _userAccessor.GetUsername());
var wasReviewed = product.Reviews
.FirstOrDefault(x => x.Author.UserName == user.UserName)
.Author.UserName;
if(wasReviewed == user.UserName)
{
return null;
}
这是评论的构建者实体:
builder.Entity<Review>()
.HasOne(p => p.Product)
.WithMany(r => r.Reviews)
.OnDelete(DeleteBehavior.Cascade);
【问题讨论】:
-
if(wasReviewed == user.UserName) - 永远是真的
-
离题,但如果您期望记录,则不应查询 [Single/First]OrDefault
-
嘿,为什么是机器人?它不应该返回与 id 匹配的一种产品吗?
-
首先,您的查询应该是这样的,以避免空引用异常
var wasReviewed = product.Reviews?.FirstOrDefault(x => x.Author.UserName == user.UserName)?.Author?.UserName;和if(wasReviewed == null) return null;而您的问题与Include无关。 -
假设它是一个空引用异常,基本上是由于有这么多查询引起的。在一个查询中执行此操作可以消除所有可能的错误(假设模型本身是好的)。
标签: asp.net .net entity-framework