直到现在,我一直在为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
Group
和ApplicationUserGroups
)。
麻烦是:
我有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()
方法所使用的上下文不同。
所以需要帮助...
答案 0 :(得分:2)
这是一个不熟悉EF人脸的常见问题。由于实体在对象上下文中处于断开状态,因此EF将尝试将实体插入关系中,即使它们已经存在。为了解决问题,您需要通过将状态设置为“未更改”来告知EF实体不是新实体。看看朱莉·勒曼(Julie Lerman)的这篇文章以及相关的SO问题/答案。