Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我想为一个网站开发一个CRUD界面,但我一直在编辑方法中出错_C#_Html_Asp.net - Fatal编程技术网

C# 我想为一个网站开发一个CRUD界面,但我一直在编辑方法中出错

C# 我想为一个网站开发一个CRUD界面,但我一直在编辑方法中出错,c#,html,asp.net,C#,Html,Asp.net,我得到的错误是: UPDATE语句与外键约束“FK_dbo.Albums_dbo.Artists_ArtistId”冲突。冲突发生在数据库“MusicStoreData”表“dbo.Artists”列“ArtistId”中 它发生在HttpPost编辑操作中 我想做的就是编辑一个特定的相册。例如:有一张名为AC/DC的专辑,我希望能够编辑流派、标题、艺术家等 我尝试更改视图,并在Db中放置一个包含当前流派和艺术家的下拉列表,但随后出现了一个引用完整性错误 这是控制器: public Action

我得到的错误是:

UPDATE语句与外键约束“FK_dbo.Albums_dbo.Artists_ArtistId”冲突。冲突发生在数据库“MusicStoreData”表“dbo.Artists”列“ArtistId”中

它发生在HttpPost编辑操作中

我想做的就是编辑一个特定的相册。例如:有一张名为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>
@model MvcMusicStore.Models.Album
@{
ViewBag.Title=“编辑”;
}
编辑
@使用(@Html.BeginForm())
{
@Html.HiddenFor(x=>x.AlbumId)
专辑
体裁
@Html.TextBoxFor(x=>x.Genre.Name) 艺术家
@Html.TextBoxFor(x=>x.Artist.Name) 标题
@EditorFor(x=>x.Title) 价格
@Html.TextBoxFor(x=>x.Price) 说明
@EditorFor(x=>x.Genre.Description)

} @ActionLink(“返回列表”、“索引”)
这些是模型类:

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; }
    }
}
名称空间MvcMusicStore.Models
{
公开课相册
{
public int AlbumId{get;set;}
public int GenreId{get;set;}
公共int ArtistId{get;set;}
公共虚拟类型{get;set;}
公共字符串标题{get;set;}
公共十进制价格{get;set;}
公共虚拟艺术家{get;set;}
}
公共课体裁
{
public int GenreId{get;set;}
公共字符串名称{get;set;}
公共字符串说明{get;set;}
公共列表相册{get;set;}
}
公共级艺术家
{
公共int ArtistId{get;set;}
公共字符串名称{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; }
    }
}
名称空间MvcMusicStore.Models
{
公共类MusicStoreEntities:DbContext
{
公共数据库集相册{get;set;}
公共数据库集类型{get;set;}
公共数据库集艺术家{get;set;}
}
}

我知道我错过了什么,但我真的无法确定。如果有人愿意帮助我,我会很高兴。谢谢

您可以通过两种方式解决此问题:

1。简单的方法和不完整的方法-只是为了消除错误

只需添加:

 @Html.HiddenFor(x => x.ArtistId)
以你的形式。您的请求是无状态的,因此服务器只是被发送表单中包含的内容。但是,这会使你无法用其中一个文本框更改你的艺术家(但这也不起作用,我将在第二个选项中讨论)

2。稍微好一点的方法

现在,您正在向控制器发布与您的模型不匹配的数据。您的控制器需要一个
相册
类型对象,您正在发布
流派.Name
之类的内容,而
相册
没有此类内容。因此,对于这些对象的外键,控制器将默认设置为
0
(这就是您现在面临的问题)。我建议创建一个名为
AlbumEditViewModel
的新类,该类包含
GenreName
ArtistName
的文本字段(您可能希望从此视图中删除
Genre.Description
,因为我认为您不想编辑它)。在该视图的get方法中,使用给定相册的适当值对ViewModel进行水合物化,然后将其发送到视图。在post方法中,您将根据
Album.AlbumId
从数据库中获取
Album
模型,还将获取
流派
艺术家
的ID,然后在保存
Album
之前设置
专辑
模型的ID

其他建议

我可能会将其更改为下拉列表而不是文本框,因为现在需要精确匹配才能获得艺术家ID。或者,您可以将其保留为文本框,并让控制器检查是否存在具有此名称的艺术家,如果没有,则在分配ID之前在数据库中创建具有此名称的新艺术家


如果您有任何疑问,请告诉我。

尝试找出EF生成的确切SQL语句。似乎它正在尝试再次添加交流/直流-让有岩石!因此,我应该像这样创建一个ViewModel:public string GenreName{get;set;}public string ArtistName{get;set;}以及如何在get方法中填充它们?是的,还包括AlbumID的属性(以及您想要显示的其他属性)。在GET方法中,像您一样从数据库中获取相册,只需创建ViewModel的新实例并手动复制属性。有一些库可以自动完成(AutoAppER),您可能需要考虑了解它们。非常有用,可以让您编写更多可维护的代码。