【问题标题】:How to check for primary key and foreign key condition in EF core right?如何检查EF核心中的主键和外键条件?
【发布时间】:2016-12-21 21:59:30
【问题描述】:

我有一个带有 Id 和 User 属性的 Post 实体。 用户是身份用户。 我的实体上没有 UserId 属性,因为我不需要它。

如何以最佳方式检查帖子是否属于当前用户? 我想过这个

var currentUser = await userManager.GetUserAsync(httpAccessor.HttpContext.User);
if (!await context.Posts.FromSql(
    @"SELECT TOP 1 UserId
      FROM Posts
      WHERE Id = {0}", postId).Any(Id => Id == currentUser.Id))
    throw new InvalidOperationException("Post does not belong to current user.");

或者这个

if (!await context.Posts.AnyAsync(p => p.Id == post.Id && p.User.Id == currentUser.Id))
    throw new InvalidOperationException("Post does not belong to current user.");

但它不起作用。

这是从第二个选项生成的 SQL

SELECT CASE
    WHEN EXISTS (
        SELECT 1
        FROM [Posts] AS [p]
        INNER JOIN [AspNetUsers] AS [p.User] ON [p].[UserId] = [p.User].[Id]
        WHERE ([p].[Id] = @__post_Id_0) AND ([p.User].[Id] = @__currentUser_Id_1))
    THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END

【问题讨论】:

  • 你能告诉我们你的帖子和用户模型代码吗?

标签: entity-framework-core


【解决方案1】:

对于您的情况,“最佳”方式是从数据库中读取 Post 对象(var post = await context.Posts.SingleAsync(x => x.Id = postId); 并检查User

这将导致从Post 读取所有属性,包括大文本(帖子正文等)。您可以尝试通过仅选择匿名类的特定属性来避免这种情况:

var postUser = await context.Posts
    .Where(x => x.Id = postId)
    .Select(x => new {
         x.Id,
         UserId = x.User.Id
    })
    .FirstOrDefaultAsync();

【讨论】:

  • 嗯,我考虑过了,它必须产生我想要的 SQL,但它在 LINQ 语法中更冗长。
猜你喜欢
  • 1970-01-01
  • 2020-09-28
  • 2021-06-01
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多