实体框架尝试添加用户两次并抛出已经采用EntityValidationException的用户名

时间:2018-02-12 23:22:23

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

我正试图通过EntityFramework进入MVC。 它进展顺利,但有一些我无法弄清楚。

我有3个模型,BierlijstEntryHuisApplicationUser。 我试图实现以下关系

  • ApplicationUser * ... * Huis
  • ApplicationUser 1 ... * BierlijstEntryBierlijstEntry有一个ApplicationUser
  • Huis 1 ... * BierlijstEntryBierlijstEntry有一个Huis

     namespace BierlijstMVC
    {
        public partial class DatabaseContext : IdentityDbContext<ApplicationUser>
        {
        public DatabaseContext()
            : base("DBContext")
        {
        }
    
        public static DatabaseContext Create()
        {
            return new DatabaseContext();
        }
    
        public virtual DbSet<BierlijstEntry> BierlijstEntries { get; set; }
        public virtual DbSet<Huis> Huizen { get; set; }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
    
            modelBuilder.Entity<Huis>()
                .HasMany(x => x.Users)
                .WithMany(x => x.Huis);
    
            modelBuilder.Entity<Huis>()
                .HasMany(e => e.BierlijstEntry)
                .WithRequired(e => e.Huis);
    
            modelBuilder.Entity<ApplicationUser>()
                .HasMany(x => x.BierlijstEntries)
                .WithRequired(x => x.User);
        }
    }
    

    }

模型定义如下:

BierlijstEntry

namespace BierlijstMVC.Models
{
    public class BierlijstEntry
    {
        [Key]
        public int BierlijstEntryId { get; set; }

        public int Gedronken { get; set; }
        public int Gehaald { get; set; }

        public int HuisId { get; set; }
        public string UserId { get; set; }

        public virtual Huis Huis { get; set; }
        public virtual ApplicationUser User { get; set; }
    }
}

Huis区

namespace BierlijstMVC.Models
{
    public class Huis
    {
        public Huis()
        {
            Users = new List<ApplicationUser>();
            BierlijstEntry = new List<BierlijstEntry>();
        }

        [Key]
        public int HuisId { get; set; }

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

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

        public virtual ICollection<BierlijstEntry> BierlijstEntry { get; set; }
    }
}

ApplicationUser

namespace BierlijstMVC.Models
{
    [Table("AspNetUsers")]
    public partial class ApplicationUser : IdentityUser
    {
        public ApplicationUser()
        {
            Huis = new List<Huis>();
            BierlijstEntries = new List<BierlijstEntry>();
        }

        public string Nickname { get; set; }

        public virtual ICollection<Huis> Huis{ get; set; }
        public virtual ICollection<BierlijstEntry> BierlijstEntries { get; set; }

        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
            userIdentity.AddClaim(new Claim("Nickname", this.Nickname.ToString()));

            return userIdentity;
        }
    }
}

现在我的注册表给了我三个字段:Email, Password, Nickname (ApplicationUser) and Huisnaam (Huis)

[HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Register(RegisterViewModel model)
        {
            if (ModelState.IsValid)
            {
                var user = new ApplicationUser { UserName = model.Email, Email = model.Email, Nickname = model.Nickname};
                var result = await UserManager.CreateAsync(user, model.Password);
                if (result.Succeeded)
                {
                    var db = new DatabaseContext();
                    if (!db.Huizen.Any(x => x.Huisnaam.Equals(model.HouseName)))
                    {
                        var huis = new Huis()
                        {
                            Huisnaam = model.HouseName,

                        };
                        BierlijstEntry entry = new BierlijstEntry();
                        entry.Huis = huis;
                        entry.User = user;
                        Huis.BierlijstEntry.Add(entry);
                        Huis.Users.Add(user);
                        user.Huis.Add(huis);
                        user.BierlijstEntries.Add(entry);
                        db.Huizen.AddOrUpdate(huis);
                        db.BierlijstEntries.AddOrUpdate(entry);
                        try
                        {
                            db.SaveChanges();
                        }
                        catch (DbEntityValidationException ex)
                        {
                            ** SNIP: Catch exception
                        }
                    }

                    await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);

                    string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                    var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);

                    UserManager.EmailService = new EmailService();
                    await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");

                    return RedirectToAction("Index", "Home");
                }
                AddErrors(result);
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }

第一部分代码是用户的标准创建。一旦命中db.SaveChanges(),代码就会中断。

我假设由于关系,用户被添加两次。我得到的错误是我正在尝试添加已存在的用户名。 CreateUser确实是第一次添加它,但SaveChanges也出于某种原因。但是,我不知道为什么和在哪里。我想要一些帮助

修改

我的数据库中有一个HuisApplicationUser表,映射为 ApplicationUser * ... * Huis但由于某种原因,它未添加到该表中,而是作为新用户添加

1 个答案:

答案 0 :(得分:0)

此行将添加您已添加的同一用户。     Huis.Users.Add(用户);

对于多对多的关系,您是否有另一个名为UserHuis的表或类似的表?根据您使用的asp.net版本,可以使用与此类似的内容进行映射。

modelBuilder.Entity<Huis>()
            .HasMany<Users>(u => u.Users)
            .WithMany(h => h.Huis)
            .Map(hu =>
                    {
                        hu.MapLeftKey("HuisId");
                        hu.MapRightKey("UserId");
                        hu.ToTable("UserHuis");
                    });