【问题标题】:EF include not getting the data correctlyEF 包括未正确获取数据
【发布时间】: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 =&gt; x.Author.UserName == user.UserName)?.Author?.UserName;if(wasReviewed == null) return null; 而您的问题与Include 无关。
  • 假设它是一个空引用异常,基本上是由于有这么多查询引起的。在一个查询中执行此操作可以消除所有可能的错误(假设模型本身是好的)。

标签: asp.net .net entity-framework


【解决方案1】:

这是一种检查产品是否已有当前用户评论的复杂方法。可以简化为一个查询:

var productId = request.ProductId;
var currentUserName = _userAccessor.GetUsername();

bool isReviewed = _context.Products
    .Any(p => p.Id == productId
           && p.Reviews.Any(r => r.Author.UserName == currentUserName));

这就是说:检查是否有具有此特定 ID 的产品,该产品的评论中作者的姓名等于当前用户的姓名。

它不仅更简单,而且更便宜:它只是一个查询,只从数据库返回一位值。

【讨论】:

    猜你喜欢
    • 2017-04-14
    • 1970-01-01
    • 2012-12-29
    • 2020-09-23
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多