实体代码首先重复的条目(MVC身份)

时间:2018-08-13 17:41:58

标签: c# entity-framework asp.net-identity

直到现在,我一直在为SQL Server使用自己的DAL。 在一个新项目中,我决定在MVC项目和Identity中使用Entity。 我曾经使用过桥表。 这是我的IdentityModels(简体)

ApplicationUser

 public class ApplicationUser : IdentityUser
 {
    [Required]
    public string Surname { get; set; }

    [Required]
    public string Name { get; set; }

    public virtual ICollection<Group> Groups { get; set; }
 }

public class Group
{
    [Key]
    public int Id { get; set; }

    [Display(Name = "Nom du Groupe")]
    [Required]
    [CustomRemoteValidation("IsGroupNameExist", "Groups", AdditionalFields = 
    "Id")]
    public string Name { get; set; }

    public virtual ICollection<ApplicationUser> ApplicationUsers { get; set; 
}

和DbContext

 public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }

    public DbSet<Group> Groups { get; set; }
}

我需要的所有表均已创建,并且看起来已经很好地创建了(ApplicationUser GroupApplicationUserGroups)。

麻烦是: 我有3个群组(A,B,C),编号分别为1,2,3。我正在表ApplicationUser中添加一个用户,该用户在Groups属性中具有3个组。 第一部分没问题,它在桥表(ApplicationUsersGroup)中添加了良好的值,但它又添加了A,B,C组,并在Group表中添加了ID 4,5,6。

CreateAsync的{​​{1}}方法不是重点(只是UserManager就是一样)。 如果看一下调试器,我可以看到,当我将用户对象传递给add方法时,在Add属性中,我有一个Groups属性,其中包含ApplicationUsers属性。对我来说,这可能是原因,但是如果我从Groups中删除Groups属性,则代码首先不会创建ApplicationUser

我错了什么,但是呢?在没有ApplicationUserGroups表的其他条目的情况下,如何拥有一个用户?

谢谢您的帮助。

UPDATE

好吧,现在我了解了为什么要添加重复项,但就我而言,如何避免这种情况? 这是Group方法的相关部分:

Register

List<Group> selectedItems = new List<Group>(); foreach (GroupTableViewModel item in model.SelectedGroups) { if (item.Selected == true) selectedItems.Add(new Group { Id = item.Id, Name = item.GroupName }); } var user = new ApplicationUser { Name = model.Name, Surname = model.Surname, UserName = model.Surname + "." + model.Name, Email = model.Email,Groups=selectedItems}; string password = RandomPassword.Generate(8, 8); var result = await UserManager.CreateAsync(user, password); 是身份验证方法。我不明白它是如何添加用户的(我在JustDecompile中看不到任何CreateAsync()Add())。 也许我又错了,但是如果我想将实体附加到上下文,则必须创建一个新的上下文,该上下文与'SaveChanges()方法所使用的上下文不同。

所以需要帮助...

1 个答案:

答案 0 :(得分:2)

这是一个不熟悉EF人脸的常见问题。由于实体在对象上下文中处于断开状态,因此EF将尝试将实体插入关系中,即使它们已经存在。为了解决问题,您需要通过将状态设置为“未更改”来告知EF实体不是新实体。看看朱莉·勒曼(Julie Lerman)的这篇文章以及相关的SO问题/答案。

https://msdn.microsoft.com/en-us/magazine/dn166926.aspx

Entityframework duplicating when calling savechanges