Kan hende du kom over noe lignende i fjor.
Gitt at du har en klasse som refererer til en annen klasse, eksempelvis slik:
public class BlogPost
{
public int BlogPostID { get; set; }
public string Title { get, set; }
public string Content { get; set; }
// Her henviser en BlogPost til en annen klasse
public ApplicationUser Author { get; set; }
}
Dersom man skal ha en Edit action i kontroller gjør man noe lignende:
Antar at vi har en:
private readonly ApplicationDbContext _context;
public async Task<IActionResult> Edit(int id, [Bind("BlogPostID, Title, Content") BlogPost post)
{
// Forfatteren lastes ikke inn automatisk så vi kan gjøre:
var author = _context.BlogPosts
.Include(blogPost => blogPost.Author
.AsNoTracking()
.FirstOrDefaultAsync(entry => entry.BlogPostId == id)
.Result
.Author;
// .NET Lar oss ikke hente ut forfatter uten å spesifisere AsNoTracking, siden begge postene har samme Primary Key
// Derfor må vi merke den som AsNoTracking(). Er det noen måte å slippe å gjøre dette på, altså at argumentet til
// funksjonen automatisk laster inn relaterte data på egenhånd?
// Det gjør det forvirrende hvis man skal abstracte til en service klasse og må ha to funksjoner som gjør det samme:
_blogPostService.LoadBlogPostAsync(id);
_blogPostService.LoadBlogPostAsNonTrackingAsync(id);
if(author.Id != User.Id)
{
// Prevent user from editing blog post
}
}
Comments