2016-04-12 9 views
0

私は非常に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

答えて

2

オクラホマので、私は2つのコンテキスト(ワンオートは「IdentityModel.cs」を生成し、私はこのチュートリアルcreating-an-entity-framework-data-model-for-an-asp-net-mvc-application次生成した第二)を持っているとして、私は...私が間違ってやっていたものを見つけるために

を管理します

各コンテキストは、同じテーブルを使用して、異なるデータベースを指していました。

私は「大学図書館」を登録ページで使用することを誓っていましたが、間違ったデータベースで作成されました。

それから私は、両方のコンテキストが同じデータベースを指す作るためにいくつかの変更を行って、私のLibraryManagementWebAppContextがIdentityDbContext

大学図書館のための私のコンテキストから継承作られた:

public class LibraryManagementWebAppContext : IdentityDbContext<ApplicationUser> 
{ 
    public LibraryManagementWebAppContext() : base("name=DefaultConnection") 
    { 
    } 

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

} 

とVisual Studioによって生成されたデフォルトのIdentityModel :

public ApplicationDbContext() 
     : base("name=DefaultConnection", throwIfV1Schema: false) 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
    } 

    public static ApplicationDbContext Create() 
    { 
     return new ApplicationDbContext(); 
    } 


} 

その後、私はデータベースを削除して、うまくいった: 1 - 大学図書館を作成する 2 - 私の大学図書館リストを使用してユーザーを登録する

私が前に言ったように、私はasp.NETには非常に新しいので、おそらく私は働いていても最高のものではない。 私の答えを補完するか、何かできることを詰めてください。

ありがとうございます。

関連する問題