2016-08-03 19 views
0

Ich habe eine Post-Entität mit Id- und User-Eigenschaften. Benutzer ist IdentityUser. Ich habe keine UserId-Eigenschaft auf meiner Entität, da ich sie nicht brauche.Wie nach Primärschlüssel und Fremdschlüsselzustand im EF-Kern prüfen?

Wie kann ich überprüfen, ob Post dem aktuellen Benutzer auf optimale Weise gehört? dachte ich über dieses

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

oder diese

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

Aber es funktioniert nicht.

Dies ist eine SQL aus der zweiten Option generiert

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

Können Sie uns Ihren Post- und Benutzermodell-Code zeigen? – theMohammedA

Antwort

0

Für Ihren Fall „optimal“ Art und Weise ist Beitrag Objekt von DB (var post = await context.Posts.SingleAsync(x => x.Id = postId); und überprüfen User darauf.

Dies führt dazu, das Lesen zu lesen Alle Eigenschaften von Post, einschließlich großer Texte (Post-Text, usw.) Sie können versuchen, dies zu vermeiden, indem Sie nur bestimmte Eigenschaften für die anonyme Klasse auswählen:

+0

Nun, ich dachte darüber nach und es muss das SQL erzeugen, das ich wollte, aber es ist in der LINQ-Syntax ausführlicher. – Andrii