c# - 尝试编写 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: </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。
解决方案
推荐阅读
- tensorflow - 添加词作为词嵌入的标签
- windows - 优雅地终止 Windows 上的进程
- c# - C# - 尝试设置 ListView 数据源时出现异常
- java - 当我运行我的 Java / Hibernate 应用程序时出现“访问 stax 流时出错”
- tableau-api - Tableau 中的状态比率计算
- javascript - 在 Object 和 Object.prototype 上分配属性有什么不同?
- php - 通过函数调用防止表单提交 onclick 使用字体真棒创建的按钮
- javascript - Java script )) 关于随机问答游戏的问题
- c - 传递指向 va_list 的指针的 gcc 错误消息
- node.js - 在 Heroku 上获取请求返回 create-react-app 默认页面?