插入/添加后在Entity Framework中强制重新加载实体

肖恩

我有一个Project实体,定义为:

public class Project
{
    [Key]
    public Guid ProjectId { get; set; }
    //...
    [Required, ForeignKey("User")]
    public Guid UserId { get; set; }
    public virtual User User { get; set; }    
}

在我的控制器中,我有:

// insert
public IHttpActionResult Post([FromBody] ProjectDTO projectDTO)
{
    return Save(projectDTO);
}

// update
public IHttpActionResult Post(Guid id, [FromBody] ProjectDTO projectDTO)
{
    return Save(projectDTO);
}

private IHttpActionResult Save(ProjectDTO projectDTO)
{
    if (!ModelState.IsValid)
        return BadRequest(ModelState);

    var isNew = projectDTO.ProjectId == Guid.Empty;

    Project project;
    if (isNew)
    {
        project = new Project();
        var user = UserManager.FindByName(User.Identity.Name);
        projectDTO.UserId = new Guid(user.UserId.ToString());

        DbContext.Entry(project).State = EntityState.Added;
    }
    else
    {
        project= DbContext.Projects.Find(projectDTO.ProjectId);
        if (project == null) return NotFound();

        DbContext.Entry(project).State = EntityState.Modified;
    }

    // set fields from DTO to User...

    DbContext.SaveChanges();

    // issue:

    return Ok(project);
}

问题在于,当控制器返回新插入的项目时,虚拟字段User将为null,因为尚未使用用户数据加载/填充该字段

在线路上,// issue:我尝试了以下两条线路:

if (isNew)
{
    // try one of these two lines:
    DbContext.Entry(project).Reload();
    project = DbContext.Projects.Find(project.ProjectId);
}

但是两者都没有作用:我认为使用Find并不会真正返回数据库,因为该实体已经存在于上下文中,因此它只是返回该实体。但是我本以为重新加载会迫使项目与FK关系完全重新加载,但事实并非如此。

我可以做这样的事情:

if (isNew)
{
    project.User = DbContext.Users.Find(project.UserId);
}

但这看上去并不像我想要的那么干净:我必须为要返回的每个FK进行此操作。

处理此问题的最佳方法是什么?

cl

您可以先将其拆离,这将强制重新加载:

DbContext.Entry(project).State = EntityState.Detached;
project = DbContext.Projects.Find(project.ProjectId);

如果这不起作用,您可以使用ObjectContext代替它来分离它,但是这可能会在EF的未来版本(DbContext不使用ObjectContext上停止工作

((IObjectContextAdapter)DbContext).ObjectContext.Detach(project);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

插入后在Entity Framework 5中获取记录ID

来自分类Dev

IEquatable中断了Entity Framework实体的加载

来自分类Dev

在 Entity Framework Core 中添加实体图

来自分类Dev

从NuGet下载后无法添加对Entity Framework 6的引用

来自分类Dev

我可以通过实体拆分在Entity Framework 6中延迟加载实体的一部分吗?

来自分类Dev

在ufw中添加规则后是否需要重新加载?

来自分类Dev

在ufw中添加规则后是否需要重新加载?

来自分类Dev

在KieBase中添加/删除规则后重新加载KieSession

来自分类Dev

部署后如何强制客户端重新加载?

来自分类Dev

发布更改后强制重新加载Blazor客户端

来自分类Dev

启动后无声音,必须强制重新加载

来自分类Dev

打开新窗口后强制按钮重新加载页面

来自分类Dev

如何使用Entity Framework Core加载相关实体

来自分类Dev

与Linq相交的Entity Framework实体中的元素

来自分类Dev

在uitableview中插入行并重新加载

来自分类Dev

首先在Entity Framework 7代码中添加/插入包含复杂类型的新条目

来自分类Dev

使用 Entity Framework 6 插入断开的相关实体

来自分类Dev

如何在yq中的特定键后在Yaml中插入或添加字段

来自分类Dev

尝试在Entity Framework中添加到父项时,我的子项实体为null

来自分类Dev

将存储过程添加到数据模型后,无法构建Entity Framework 6

来自分类Dev

在Oracle SQL Developer中插入后如何添加触发器以自动计算行数

来自分类Dev

如果我在表中添加值,插入后触发“AFTER INSERT”不起作用?

来自分类Dev

插入新记录后如何重新加载列表?

来自分类Dev

如何在不延迟加载Entity Framework的情况下加载嵌套实体?

来自分类Dev

微风:子实体已被其他人删除后,在重新加载父实体后它们仍然出现

来自分类Dev

使用DTO在Entity Framework中延迟加载

来自分类Dev

添加新条目后如何重新加载tableview?

来自分类Dev

在oracle中插入表B后创建将新行添加到表A中的触发器时出错

来自分类Dev

如何在不更改数据库模型的情况下在Entity Framework中添加新的实体属性

Related 相关文章

  1. 1

    插入后在Entity Framework 5中获取记录ID

  2. 2

    IEquatable中断了Entity Framework实体的加载

  3. 3

    在 Entity Framework Core 中添加实体图

  4. 4

    从NuGet下载后无法添加对Entity Framework 6的引用

  5. 5

    我可以通过实体拆分在Entity Framework 6中延迟加载实体的一部分吗?

  6. 6

    在ufw中添加规则后是否需要重新加载?

  7. 7

    在ufw中添加规则后是否需要重新加载?

  8. 8

    在KieBase中添加/删除规则后重新加载KieSession

  9. 9

    部署后如何强制客户端重新加载?

  10. 10

    发布更改后强制重新加载Blazor客户端

  11. 11

    启动后无声音,必须强制重新加载

  12. 12

    打开新窗口后强制按钮重新加载页面

  13. 13

    如何使用Entity Framework Core加载相关实体

  14. 14

    与Linq相交的Entity Framework实体中的元素

  15. 15

    在uitableview中插入行并重新加载

  16. 16

    首先在Entity Framework 7代码中添加/插入包含复杂类型的新条目

  17. 17

    使用 Entity Framework 6 插入断开的相关实体

  18. 18

    如何在yq中的特定键后在Yaml中插入或添加字段

  19. 19

    尝试在Entity Framework中添加到父项时,我的子项实体为null

  20. 20

    将存储过程添加到数据模型后,无法构建Entity Framework 6

  21. 21

    在Oracle SQL Developer中插入后如何添加触发器以自动计算行数

  22. 22

    如果我在表中添加值,插入后触发“AFTER INSERT”不起作用?

  23. 23

    插入新记录后如何重新加载列表?

  24. 24

    如何在不延迟加载Entity Framework的情况下加载嵌套实体?

  25. 25

    微风:子实体已被其他人删除后,在重新加载父实体后它们仍然出现

  26. 26

    使用DTO在Entity Framework中延迟加载

  27. 27

    添加新条目后如何重新加载tableview?

  28. 28

    在oracle中插入表B后创建将新行添加到表A中的触发器时出错

  29. 29

    如何在不更改数据库模型的情况下在Entity Framework中添加新的实体属性

热门标签

归档