私は非常にasp.net MVCに新しく、このアプリケーションの構築を練習しています。エラー「INSERTステートメントがFOREIGN KEY制約と競合しました」カスタムプロパティとリレーションシップを持つIDを使用して
私は、Visual Studioによって生成されたデフォルトのIdentityModel.csにカスタムプロパティを追加しようとしています。このカスタムプロパティは、ユーザーが所属する大学図書館を保持します。
私はこの投稿を大きすぎると申し訳なく思っていますが、実際には何が原因で発生しているのか分からないのですか? は、大学図書館のエンティティを作成::
public class UniversityLibrary
{
[Key]
public int UniversityLibraryId { get; set; }
public string UniversityLibraryName { get; set; }
public virtual ICollection<ApplicationUser> Users {get;set;}
}
はIdentityModel.csにカスタムプロパティを追加しました:
public class ApplicationUser : IdentityUser
{
public virtual UniversityLibrary UniversityLibraries { get; set; }
public int UniversityLibraryId { 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
return userIdentity;
}
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("name=DefaultConnection", throwIfV1Schema: false)
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
はRegisterViewModelにカスタムプロパティを追加しました:
を私がこれまでに作ってきた何
public class RegisterViewModel
{
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }
[Required]
[DisplayName("University Library ID")]
public int UniversityLibraryId { get; set; }
public virtual ICollection<UniversityLibrary> Libraries { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
作成された大学図書館のリストActionFilterを使用して、私のビューに渡されるS:
public class ViewbagListOfUniversityLibraries : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
IncludeRoleListIntoViewBag(filterContext.Controller.ViewBag);
base.OnActionExecuted(filterContext);
}
private void IncludeRoleListIntoViewBag(dynamic viewBag)
{
using (var db = new LibraryManagementWebAppContext())
{
viewBag.UniversityLibraryList = db.UniversityLibraries
.OrderBy(x => x.UniversityLibraryName)
.Select(unversityLibrary => new SelectListItem()
{
Text = unversityLibrary.UniversityLibraryName,
Value = unversityLibrary.UniversityLibraryId.ToString()
})
.ToList();
}
}
}
は、大学図書館のドロップダウンを追加するために登録するビューを変更:
@model LibraryManagementWebApp.Models.RegisterViewModel
@{
ViewBag.Title = "Register";
IEnumerable<SelectListItem> universityLibraryList = ViewBag.UniversityLibraryList;
}
...
<div class="form-group">
@Html.LabelFor(m => m.UniversityLibraryId, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.DropDownListFor(m => m.UniversityLibraryId, universityLibraryList,"Select One", new { @class = "form-control" })
</div>
</div>
は私の他のコンテキスト(大学図書館のコンテキスト)にmodelbuildersを追加しました、 「EntityType 'IdentityUserLogin'」のように誤ってキーが定義されていないためです。私は新しいを登録しようとすると :
[HttpPost]
[AllowAnonymous]
[ViewbagListOfUniversityLibraries]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.Email, Email = model.Email, UniversityLibraryId = Convert.ToInt32(model.UniversityLibraryId) };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
// For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
// Send an email with this link
// string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
// var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
// 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);
}
問題がある:私のデータベースに新規ユーザーを作成する前に、選択された値を取得するためのコントローラを修正し、このEntityType」
public class LibraryManagementWebAppContext : DbContext
{
public LibraryManagementWebAppContext() : base("name=LibraryManagementWebAppContext")
{
}
public DbSet<UniversityLibrary> UniversityLibraries { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<IdentityUserLogin>().HasKey(l => l.UserId);
modelBuilder.Entity<IdentityRole>().HasKey(r => r.Id);
modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });
modelBuilder.Entity<UniversityLibrary>().HasKey(r => r.UniversityLibraryId);
base.OnModelCreating(modelBuilder);
}
}
のためのキーを定義します。ユーザーは、このエラーを取得:
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_dbo.AspNetUsers_dbo.UniversityLibraries_UniversityLibraryId". The conflict occurred in database "ASPNET_LIBRARYMANAGEMENTWEBAPP_aa38b17e20d0416d8c53a3a5d0faa59e", table "dbo.UniversityLibraries", column 'UniversityLibraryId'.
をそして私はそれを解決する方法を知らない 私のコードをデバッグする私は私のユーザー変数がVALUを持って見ることができます。 UniversityLibraryIdのe。 Debugging: user variable that is passed to CreateAsync
また、データベースおよびUniversityLibraryテーブルで既に確認されているこのIDの項目があります。 checked the database to see if the data is there