C# 如何在SaveChangesAsync()之后从对象获取ID
我有两个目标C# 如何在SaveChangesAsync()之后从对象获取ID,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我有两个目标 职位 形象 我用我的create_post控制器上传图像,并希望在创建帖子后创建图像对象。我想在图像对象中添加PostId,但我不知道如何在SaveChangesAsync()之后获得PostId 这是我的代码: public async Task<IActionResult> CreatePost([FromForm]PostModel post) { var user = User.FindFirst("User
- 职位
- 形象
public async Task<IActionResult> CreatePost([FromForm]PostModel post)
{
var user = User.FindFirst("UserID")?.Value;
if (post.content != null && user != null)
{
var postdata = new Posts
{
Content = post.content,
CreatorId = user,
Created = DateTime.Now
};
context.Posts.Add(postdata);
await context.SaveChangesAsync();
if (post.Images != null)
{
foreach (var file in post.Images){
var image = new Images
{
userId = user,
postId = post.Id
};
var uniqueFileName = GetUniqueFileName(file.FileName);
var uploads = Path.Combine(hostingEnvironment.WebRootPath, "Images/PostImages");
var filePath = Path.Combine(uploads, uniqueFileName);
await file.CopyToAsync(new FileStream(filePath, FileMode.Create));
image.imageFilePath = filePath;
}
}
return Ok(post);
}
else
{
return BadRequest(new { ErrorMessage = "Textfeld darf nicht leer sein!" });
}
}
public异步任务CreatePost([FromForm]PostModel post)
{
var user=user.FindFirst(“UserID”)?.Value;
if(post.content!=null&&user!=null)
{
var postdata=新职位
{
Content=post.Content,
CreatorId=用户,
Created=DateTime.Now
};
context.Posts.Add(postdata);
wait context.saveChangesSync();
如果(post.Images!=null)
{
foreach(post.Images中的var文件){
var image=新图像
{
userId=user,
postId=post.Id
};
var uniqueFileName=GetUniqueFileName(file.FileName);
var uploads=Path.Combine(hostingEnvironment.WebRootPath,“图像/后期图像”);
var filePath=Path.Combine(上传,uniqueFileName);
wait file.CopyToAsync(新文件流(filePath,FileMode.Create));
image.imageFilePath=文件路径;
}
}
返回Ok(post);
}
其他的
{
返回BADDREQUEST(新的{ErrorMessage=“Textfeld darf nicht leer sein!”);
}
}
有人能帮我吗?从代码中可以看出,在创建图像实体后,您似乎没有对其进行持久化或任何操作。设置关系/w导航属性时,可以让EF自动保留关系,而无需手动设置FK关系 即 这里的要点是,如果要同时保存帖子和文件,请避免多次调用
SaveChanges
。您可以利用导航属性,创建图像并将其添加到Post.Images集合中,而不是创建图像并设置PostID(只有在调用SaveChanges
后才能使用)。当EF保存帖子及其相关图片时,它将自动管理必要的FK分配
避免多次调用SaveChanges
的原因是为了帮助确保相关更改要么一起提交,要么根本不提交。如果保存帖子,请稍后转到“保存图像”,保存图像时出现问题,帖子已提交。这会在数据库中保留不完整的数据,这可能会干扰纠正和重试操作的尝试
保存后获取Post ID仍然很有用,例如在保存完成后将ID传递回视图,以满足任何进一步的更新请求等。您也可以在保存更改之前访问ID,方法是访问“EntityEntry”的属性“Entity”,如下所示:
postdata = context.Posts.Add(postdata).Entity;
在此之后,postdata将具有Id值而不保存更改。您的
postdata
对象应具有PostId
属性,一旦调用savechangesync
,该属性将由EF填充。啊,完美:)您保存了我的一天!
postdata = context.Posts.Add(postdata).Entity;