如何检查EF核心中的主键和外键条件是对吗?

时间:2016-08-03 20:06:45

标签: entity-framework-core

我有一个具有Id和User属性的Post实体。 用户是IdentityUser。 我的实体上没有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

1 个答案:

答案 0 :(得分:0)

对于您的情况"最佳"方法是从数据库中读取Post对象($ which gcloud /home/myusername/google-cloud-sdk/bin/gcloud $ sh -c '/home/myusername/google-cloud-sdk/bin/gcloud version' 并在其上检查var post = await context.Posts.SingleAsync(x => x.Id = postId);

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

Post