当我尝试关联现有实体时,为什么实体框架会创建一个新实体?

托德

我有一个多对多关系(用户与技能),当我尝试将现有技能与用户关联时,它总是会创建一个新技能。

用户:

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }

    public virtual ICollection<Skill> Skills { get; set; }
}

技能:

public class Skill
{
    public int Id { get; set; }

    public string Name { get; set; }
}

OnModelCreating:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<ApplicationUser>()
            .HasMany<Skill>(user => user.Skills)
            .WithMany();
    }

创建关联:

public ActionResult Skills(SkillsViewModel viewModel)
    {
        var user = UserManager.FindById(User.Identity.GetUserId());

        if(!string.IsNullOrWhiteSpace(viewModel.NewSkill)
            && !user.Skills
            .Where(sk => sk.Name == viewModel.NewSkill)
            .Any())
        {
            var foundSkill = this.db.Skills
                .Where(sk => sk.Name == viewModel.NewSkill)
                .FirstOrDefault();

            if(foundSkill != null)
            {
                user.Skills.Add(foundSkill);
            }
            else
            {
                user.Skills.Add(new Skill()
                    {
                        Name = viewModel.NewSkill
                    });
            }
        }

        if(viewModel.SelectedSkillId > 0)
        {
            var foundSkill = this.db.Skills.Find(viewModel.SelectedSkillId);


            user.Skills.Add(foundSkill);
        }

        this.UserManager.Update(user);

        return RedirectToAction("skills");
    }

我已逐步完成并验证了我确实确实从数据库中获得了“ foundSkill”,但是在将其添加到用户并保存用户之后,与该用户相关联的技能不是我发现的,而是具有相同名称和不同ID的新产品。

托德

我想到了。UserManager正在加载一个DbContext,而我正试图关联从另一DbContext加载的技能。

测试并解决此问题的快速技巧是从与技能相同的DbContext加载用户,更新用户,保存DbContext。

长期的解决方案是确保每个请求都使用相同的DbContext。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么实体框架尝试插入现有实体?

来自分类Dev

创建一个包含另一个现有实体的新实体

来自分类Dev

为什么当我创建新实体时Shopify实体ID每次增加4?

来自分类Dev

Micronaut数据jdbc:保存现有实体会创建一个新实体,而不是更新现有实体

来自分类Java

自动连线存储库更新现有实体,而不是创建一个新实体

来自分类Dev

为什么实体框架为我的视图模型创建一个区分符列?

来自分类Dev

在 EntityType 字段中创建与现有实体关联的新实体

来自分类Dev

为什么在运行实体框架迁移后我只有一个表?

来自分类Dev

Elixir/Phoenix 添加一个。通过表单将实体与现有实体相关联

来自分类Java

创建与现有实体相关的新实体

来自分类Dev

当我尝试从实体框架MVC更新记录时,为什么从数据库中删除了我的记录?

来自分类Dev

当我尝试使用实体框架将表单保存到测验模型中时,为什么会出现错误?

来自分类Java

为什么我会得到尝试的实体保存到列表时,一个NullPointerException异常?

来自分类Dev

当我尝试获取值时实体框架挂起

来自分类Dev

通过存储库更新时,我的一个实体没有保存在实体框架中

来自分类Dev

为什么在插入具有现有嵌套实体的新实体时,Entity Framework Core 2.2 C#会响应错误

来自分类Dev

尝试将一个实体与另一个实体关联会导致插入

来自分类Dev

为什么 java.lang.StackOverflowError: null 当我尝试打印我的实体时

来自分类Dev

实体框架 REST 端点以获取具有另一个实体的所有实体

来自分类Dev

当其中一个模型具有 ICollection 列表时,实体框架会连接 3 个表

来自分类Dev

为什么实体框架会自动加载相关实体

来自分类Dev

原则当我设置了一个关系ManyToOne却没有建立关系时,请告诉我“找到了新实体”

来自分类Dev

为什么在更新实体框架模型时Visual Studio会删除我的类

来自分类Java

EntityManager尝试创建现有实体

来自分类Dev

应该有一个外键“到”关联实体,还是“来自”关联实体?

来自分类Dev

为什么来自 Angular 9 服务的 HTTP PUT 方法创建一个新的数据库实体而不是更新原始数据库实体?

来自分类Dev

为什么我的实体框架对象重复?

来自分类Dev

实体框架:为什么我的财产是空的?

来自分类Dev

实体框架不使用我的外键而是生成一个新列

Related 相关文章

  1. 1

    为什么实体框架尝试插入现有实体?

  2. 2

    创建一个包含另一个现有实体的新实体

  3. 3

    为什么当我创建新实体时Shopify实体ID每次增加4?

  4. 4

    Micronaut数据jdbc:保存现有实体会创建一个新实体,而不是更新现有实体

  5. 5

    自动连线存储库更新现有实体,而不是创建一个新实体

  6. 6

    为什么实体框架为我的视图模型创建一个区分符列?

  7. 7

    在 EntityType 字段中创建与现有实体关联的新实体

  8. 8

    为什么在运行实体框架迁移后我只有一个表?

  9. 9

    Elixir/Phoenix 添加一个。通过表单将实体与现有实体相关联

  10. 10

    创建与现有实体相关的新实体

  11. 11

    当我尝试从实体框架MVC更新记录时,为什么从数据库中删除了我的记录?

  12. 12

    当我尝试使用实体框架将表单保存到测验模型中时,为什么会出现错误?

  13. 13

    为什么我会得到尝试的实体保存到列表时,一个NullPointerException异常?

  14. 14

    当我尝试获取值时实体框架挂起

  15. 15

    通过存储库更新时,我的一个实体没有保存在实体框架中

  16. 16

    为什么在插入具有现有嵌套实体的新实体时,Entity Framework Core 2.2 C#会响应错误

  17. 17

    尝试将一个实体与另一个实体关联会导致插入

  18. 18

    为什么 java.lang.StackOverflowError: null 当我尝试打印我的实体时

  19. 19

    实体框架 REST 端点以获取具有另一个实体的所有实体

  20. 20

    当其中一个模型具有 ICollection 列表时,实体框架会连接 3 个表

  21. 21

    为什么实体框架会自动加载相关实体

  22. 22

    原则当我设置了一个关系ManyToOne却没有建立关系时,请告诉我“找到了新实体”

  23. 23

    为什么在更新实体框架模型时Visual Studio会删除我的类

  24. 24

    EntityManager尝试创建现有实体

  25. 25

    应该有一个外键“到”关联实体,还是“来自”关联实体?

  26. 26

    为什么来自 Angular 9 服务的 HTTP PUT 方法创建一个新的数据库实体而不是更新原始数据库实体?

  27. 27

    为什么我的实体框架对象重复?

  28. 28

    实体框架:为什么我的财产是空的?

  29. 29

    实体框架不使用我的外键而是生成一个新列

热门标签

归档