我正试图通过EntityFramework进入MVC。 它进展顺利,但有一些我无法弄清楚。
我有3个模型,BierlijstEntry
,Huis
和ApplicationUser
。
我试图实现以下关系
ApplicationUser
* ... * Huis
的ApplicationUser
1 ... * BierlijstEntry
(BierlijstEntry
有一个ApplicationUser
) Huis
1 ... * BierlijstEntry
(BierlijstEntry
有一个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
但由于某种原因,它未添加到该表中,而是作为新用户添加
答案 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");
});