首页 > 解决方案 > 尝试编写 CRUD Razor 页面 - 添加时“外键约束失败”

问题描述

这是我的代码:

专辑.cs

using System.Collections.Generic;

namespace Project.Models
{
    public class Album
    {
        public int AlbumId { get; set; }
        public string Title { get; set; }
        public int ArtistId { get; set; }

        public Artist Artist { get; set; }

        public ICollection<Track> Tracks { get; set; }
    }
}

艺术家.cs

using System.Collections.Generic;

namespace Project.Models
{
    public class Artist
    {
        public int ArtistId { get; set; }
        public string Name { get; set; }

        public ICollection<Album> Albums { get; set; }

        public ICollection<Track> Tracks { get; set; }
    }
}

奇努克.cs

using Microsoft.EntityFrameworkCore;

namespace Project.Models
{
    public class Chinook : DbContext
    {
        public DbSet<Album> Albums { get; set; }
        public DbSet<Artist> Artists { get; set; }
        public DbSet<Track> Tracks { get; set; }
        public DbSet<Genre> Genres { get; set; }
        public DbSet<Media_type> Media_types { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            string CurrentDir = System.Environment.CurrentDirectory;
            string ParentDir = System.IO.Directory.GetParent(CurrentDir).FullName;
            string path = System.IO.Path.Combine(ParentDir, "chinook.db");
            optionsBuilder.UseSqlite($"Filename={path}");
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Album>()
            .ToTable("albums")
                .HasOne(al => al.Artist)
                .WithMany(ar => ar.Albums)
                .HasForeignKey(al => al.ArtistId);

            modelBuilder.Entity<Artist>().ToTable("artists");

            modelBuilder.Entity<Media_type>()
            .ToTable("media_types")
            .HasKey(c => c.MediaTypeId);

            modelBuilder.Entity<Genre>().ToTable("genres");

            modelBuilder.Entity<Track>()
            .ToTable("tracks")
        .HasOne(mtype => mtype.Artist)
        .WithMany(trk => trk.Tracks)
        .HasForeignKey(mtype => mtype.AlbumId)
        .HasForeignKey(mtype => mtype.GenreId)
        .HasForeignKey(mtype => mtype.MediaTypeId)
        .OnDelete(DeleteBehavior.NoAction);
        }
    }
}

媒体类型.cs

// using System.ComponentModel.DataAnnotations;

namespace Project.Models
{
    public class Media_type
    {
        // [Key]
        public  int MediaTypeId { get; set; }
        public  string Name { get; set; }
    }
}

轨道.cs

namespace Project.Models
{
    public class Track
    {
        public  int TrackId { get; set; }
        public  string Name { get; set; }
        public  int AlbumId { get; set; }
        public  int MediaTypeId { get; set; }
        public  int GenreId { get; set; }
        public  string Composer { get; set; }
        public  int Milliseconds { get; set; }
        public  int Bytes { get; set; }
        public  int UnitPrice { get; set; }
        public  Album Album { get; set; }
        public Artist Artist { get; set; }

    }
}

Track.cshtml.cs


using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using Project.Models;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Project.Pages
{
    public class TracksModel : PageModel
    {
        private Chinook db;

        public TracksModel(Chinook injectedContext)
        {
            db = injectedContext;
        }
        public IEnumerable<Track> Tracks { get; set; }
        public void OnGetAsync()
        {
            ViewData["Title"] = "Chinook Web Site - Tracks";
            Tracks = db.Tracks;
        }
        [BindProperty]
        public Track Track { get; set; }

        public IActionResult OnPost()
        {
            if (ModelState.IsValid)
            {
                db.Tracks.Add(Track);
                db.SaveChanges();
                return RedirectToPage("/tracks");
            }
            return Page();
        }

        public IActionResult DeleteTrack(int TrackId)
        {
            var track = db.Tracks.Find(TrackId);

            if (track == null) return Page();

            db.Tracks.Remove(track); db.SaveChanges(); return RedirectToPage("/tracks");
        }
    }
}

轨道.cshtml

@page
@using Project.Models
@model Project.Pages.TracksModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

<div class="row">
    <h1 class="display-2">Tracks</h1>
    <table class="table">
        <thead class="thead-inverse">
            <tr>
                <th>Track ID</th>
                @* <th>Artist ID</th>
                <th>Artist name</th> *@
                <th>Track name</th>
                <th></th>
                <th></th>
            </tr>
        </thead>

        <tbody>
            @foreach (Track track in Model.Tracks)
            {
                <tr>
                    <td>@track.TrackId</td>
                    @* <td>@Html.DisplayFor(modelArtists => track.Artist.Name)</td>
                    <td>@Html.DisplayFor(modelAlbums => track.Album.Title)</td> *@
                    <td>@track.Name</td>
                    <td><a asp-page="/Tracks/Delete" asp-route-id="@track.TrackId">Delete</a></td>
                    <td><a asp-page="/Tracks/Edit" asp-route-id="@track.TrackId">Edit name</a></td>
                </tr>
            }
        </tbody>
    </table>
</div>
<div class="row">
    <p>Enter a name & TrackID for a new track:&nbsp;</p>
    <form method="POST">
        <div><input asp-for="Track.Name" /></div>
        <div><input asp-for="Track.TrackId" /></div>
        @* <div><input asp-for="Track.AlbumId" /></div>
        <div><input asp-for="Track.MediaTypeId" /></div> //Allowed nulls
        <div><input asp-for="Track.GenreId" /></div>
        <div><input asp-for="Track.Milliseconds" /></div>  //Allowed nulls
        <div><input asp-for="Track.UnitPrice" /></div>  //Allowed nulls *@
        <input type="submit" />
    </form>
</div>

当我submit立即运行上面的方法时,我得到“外键约束失败”。

我可以看到该表具有此处tracks显示的外键约束,但我不知道如何处理它们。我尝试允许该表中除两个字段之外的所有字段为空,但这并没有解决问题。任何人都可以给我一个正确的方向吗?TIA。

标签: c#asp.netasp.net-corerazorrazor-pages

解决方案


推荐阅读