实体代码第一个重复条目(MVC 标识)



到目前为止,我一直使用自己的 DAL for SQL Server。 在一个新项目中,我决定在MVC项目和Identity中使用Entity。 我曾经使用桥表。 这是我的身份模型(简化(

应用程序用户

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; 
}

和数据库上下文

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
public DbSet<Group> Groups { get; set; }
}

我需要的所有表都已创建,并且似乎创建得很好(ApplicationUserGroupApplicationUserGroups(。

问题是: 我有 3 组(A、B、C(,ID 为 1,2,3。我在表ApplicationUser中添加了一个用户,Groups属性中有 3 个组。 第一部分是OK,它添加了桥接表(ApplicationUsersGroup(中的良好值,但它再次添加组A,B,C,Group表中的ID为4,5,6。

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

我错了,但是什么?如何让表中没有其他条目的用户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);

CreateAsync()是标识方法。我不明白它是如何添加用户的(我在 JustDecompile 中没有看到任何Add()'SaveChanges()(。 也许我又错了,但如果我想将实体附加到上下文,我必须创建一个新上下文,该上下文将与CreateAsync()方法使用的上下文不同。

所以需要帮助...

这是不熟悉 EF 的人面临的常见问题。 由于对象上下文中实体处于断开连接状态,EF 将尝试在关系中插入实体,即使它们已存在。 若要解决,需要通过将实体的状态设置为"未更改"来告知 EF 实体不是新的。 看看Julie Lerman的这篇文章以及相关的SO问题/答案。

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

调用保存更改时复制实体框架

相关内容

  • 没有找到相关文章

最新更新