Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在SaveChangesAsync()之后从对象获取ID_C#_Asp.net_Entity Framework - Fatal编程技术网

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

我有两个目标

  • 职位
  • 形象
我用我的create_post控制器上传图像,并希望在创建帖子后创建图像对象。我想在图像对象中添加PostId,但我不知道如何在SaveChangesAsync()之后获得PostId

这是我的代码:

        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;