我得到的错误是:
UPDATE语句与FOREIGN KEY约束“ FK_dbo.Albums_dbo.Artists_ArtistId”冲突。数据库“ MusicStoreData”,表“ dbo.Artists”,“ ArtistId”列中发生了冲突
它发生在HttpPost Edit操作中。
我要做的就是编辑特定的相册。例如:有一本名为AC / DC的专辑,我希望能够编辑流派,标题,艺术家等。
我试图更改视图,并在Db中放置一个具有当前流派和艺术家的下拉列表,但是随后出现引用完整性错误。
这是控制器:
public ActionResult Edit(int id)
{
Album album = db.Albums.Find(id);
return View(album);
}
[HttpPost]
public ActionResult Edit(Album album)
{
if(ModelState.IsValid)
{
//Album editAlbum = db.Albums.Find(album.AlbumId);
//album.AlbumId = editAlbum.AlbumId;
db.Entry(album).State = EntityState.Modified;
db.SaveChanges();
return (RedirectToAction("Index"));
}
return View(album);
}
这是视图:
@model MvcMusicStore.Models.Album
@{
ViewBag.Title = "Edit";
}
<h2>Edit</h2>
@using (@Html.BeginForm())
{
<fieldset>
@Html.HiddenFor(x => x.AlbumId)
<legend>Album</legend>
<div>
Genre<br />
@Html.TextBoxFor(x => x.Genre.Name)
</div>
<div>
Artist<br />
@Html.TextBoxFor(x => x.Artist.Name)
</div>
<div>
Title<br />
@Html.EditorFor(x => x.Title)
</div>
<div>
Price<br />
@Html.TextBoxFor(x => x.Price)
</div>
<div>
Description<br />
@Html.EditorFor(x => x.Genre.Description)
</div>
<p><input type="submit" value="Save" /></p>
</fieldset>
}
<div>@Html.ActionLink("Return to List", "Index")</div>
这些是模型类:
namespace MvcMusicStore.Models
{
public class Album
{
public int AlbumId { get; set; }
public int GenreId { get; set; }
public int ArtistId { get; set; }
public virtual Genre Genre { get; set; }
public string Title { get; set; }
public decimal Price { get; set; }
public virtual Artist Artist { get; set; }
}
public class Genre
{
public int GenreId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public List<Album> Albums { get; set; }
}
public class Artist
{
public int ArtistId { get; set; }
public string Name { get; set; }
}
}
和DbContext:
namespace MvcMusicStore.Models
{
public class MusicStoreEntities : DbContext
{
public DbSet<Album> Albums { get; set; }
public DbSet<Genre> Genres { get; set; }
public DbSet<Artist> Artists { get; set; }
}
}
我知道我丢失了一些东西,但是我真的无法动弹。如果有人愿意帮助我,我会很高兴。谢谢!
答案 0 :(得分:3)
您可以通过以下两种方法解决此问题:
1。简单方法和不完整方法-只是为了摆脱该错误
只需添加:
@Html.HiddenFor(x => x.ArtistId)
到您的表格。您的请求是无状态的,因此仅向服务器发送表单中包含的内容。但是,这将使您无法使用一个文本框来更改艺术家(但这也将不起作用,我将在第二个选项中对此进行说明)。
2。更好的方法
现在,您正在将与模型不匹配的数据发布到控制器。您的控制器需要一个Album
类型的对象,并且您正在发布Genre.Name
之类的东西,而Album
却没有。结果,对于这些对象的外键,您的控制器将默认为0
(这就是您现在面临的问题)。我建议创建一个名为AlbumEditViewModel
的新类,其中包含GenreName
和ArtistName
的文本字段(您可能想从此视图中删除Genre.Description
,因为我不认为您要对其进行编辑)。在用于此视图的get方法中,将ViewModel与给定相册的适当值混合在一起,然后将其发送到视图。在您的post方法上,您将基于Album
从数据库中获得Album.AlbumId
模型,并获得Genre
和Artist
的ID,然后设置保存Album
之前,您的Album
模型。
其他建议
我可能会将其更改为下拉列表,而不是文本框,因为现在需要精确匹配才能获得艺术家ID。另外,您可以将其保留为文本框,并让控制器检查是否存在具有该名称的艺术家,如果不存在,请在分配ID之前在数据库中使用该名称创建一个新艺术家。
让我知道您是否有疑问。