2016-08-03 24 views
0

私は、IdプロパティとUserプロパティを持つPostエンティティを持っています。 ユーザーはIdentityUserです。 自分のエンティティにUserIdプロパティを持っていないので、必要ありません。EFコアの主キーと外部キーの状態を確認する方法はありますか?

投稿が現在のユーザーに最適な方法で属していることを確認するにはどうすればよいですか? 私はこの

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."); 

について考えた。しかし、それは動作しません。

これは、「最適」な方法は、DB(var post = await context.Posts.SingleAsync(x => x.Id = postId);からPostオブジェクトを読み、それにUserをチェックすることです、あなたのケースでは二番目のオプション

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 
+0

あなたのPost and User Modelsコードを教えてもらえますか? – theMohammedA

答えて

0

から生成されたSQLです。

これは読んで発生します大きなテキスト(投稿体など)を含むPostのすべてのプロパティ。匿名クラスの特定のプロパティのみを選択することで回避できます。

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

まあ私はそれについて考えて、それは私が望むSQLを生成する必要がありますが、それはLINQ構文でより冗長です。 – Andrii

関連する問題