【问题标题】:Error Key Already Exists in Table when scaffolding controller vs2015脚手架控制器vs2015时错误键已经存在于表中
【发布时间】:2016-03-23 21:13:54
【问题描述】:

我正在尝试使用 VS2015 遵循专业 MVC 4 中的音乐商店示例。我在搭建音乐商店控制器时遇到问题。每次我尝试创建控制器时,都会弹出一个错误窗口,其中唯一的信息是:“运行所选代码生成器时出错:'表中已存在密钥。'”

我已经搜索过这个特定的错误,但大多数脚手架错误解决方案似乎与 web.config 中的错误有关,但我的 web.config 甚至没有任何变化,它是新项目时创建的默认错误已创建。

我已尝试创建另一个 MVC 项目并再次对模型进行编码,但仍然收到错误消息。

如果有帮助,我正在使用 Microsoft Visual Studio Enterprise 2015 版本 14.0.247200 Update 1。

我在 Models 文件夹中创建的类如下,和书中的完全一样:

public class Album
{
    public virtual int AlbumId { get; set; }
    public virtual int GenreId { get; set; }
    public virtual int ArtistId { get; set; }
    public virtual string Title { get; set; }
    public virtual decimal Price { get; set; }
    public virtual string AlbumArtUrl { get; set; }
    public virtual Genre Genre { get; set; }
    public virtual Artist Artist { get; set; }
}

public class Artist
{
    public virtual int ArtistId { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
}

public class Genre
{
    public virtual int GenreId { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
    public virtual List<Album> Albums { get; set; }
}

感谢您的帮助

【问题讨论】:

  • 您在尝试创建新项目时是否使用了新文件夹?当 VS 尝试生成的文件已存在于文件系统上时,我看到了类似的错误。
  • 在我看来,ASP.NET 和 MVC 目前正在发生根本性的变化,所有现有的关于 MVC4 甚至 MVC5 的书籍似乎都使用 VS 2013 或更早版本,我可能应该等待关于 MVC6 的书籍按顺序排列学习这些东西并避免沮丧。为什么在 VS 2015 社区中创建的 MVC 5 项目存在诸如从 Pro ASP.NET MVC 5 等当前书籍中的 MVC 5 代码中构建脚手架代码等问题?有什么变化?
  • 第二。他们应该有一个核心教程,并确保他们修改它们并在他们发展平台时让它们继续工作。否则,你会通过跟随某事获得 25% 的收益,并达到你被抛在后面的地步。

标签: c# asp.net-mvc entity-framework visual-studio visual-studio-2015


【解决方案1】:

您确定示例中的每个属性都标记为virtual 吗?我看不出将NamePrice 等用作导航属性有何意义。

尝试以下操作,仅将导航属性(具有关系的事物)设置为虚拟。

public class Album
{
    public int AlbumId { get; set; }
    public string Title { get; set; }
    public decimal Price { get; set; }
    public string AlbumArtUrl { get; set; }
    public int GenreId { get; set; }
    public virtual Genre Genre { get; set; }
    public int ArtistId { get; set; }
    public virtual Artist Artist { get; set; }
}

public class Artist
{
    public int ArtistId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

public class Genre
{
    public int GenreId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public virtual List<Album> Albums { get; set; }
}

【讨论】:

  • 是的,他们在书中都被标记为虚拟,我也觉得这有点不寻常。我将它们更改为您提供的代码,但它仍然无法正常工作,不确定我的 VS 是否配置错误或什么。谢谢
  • 本书解释说,将事物标记为虚拟有助于实体框架“挂钩”类属性,以便在执行迁移时改进数据库版本控制。
【解决方案2】:

我遇到了同样的问题。我正在使用 Visual Studio 社区 2015。 使用代码尝试模型类:

public class MusicStoreDB : DbContext
{
    public MusicStoreDB() : base("name=MusicStoreDB")
    {
    }

    public DbSet<Album> Albums { get; set; }
    public DbSet<Artist> Artists { get; set; }
    public DbSet<Genre> Genres { get; set; }
}

在添加控制器窗口中,使用 MusicStoreDB 作为上下文。

工作代码可以在here找到。

第 4 章的代码看起来像是从数据库生成的,所以 MusicStoreDB 类略有不同。

【讨论】:

  • 按照 Jan 的建议手动将此类添加到 Model 文件夹似乎对我有用。但是,关键是脚手架向导旨在实际创建此文件,而不是您必须先手动创建它。 Wrox 网站上也没有关于此的勘误表信息。这个问题非常令人困惑,还没有明确的答案。希望本章后面不会因为手动添加类而出现问题。如果一切顺利,我会将其标记为有效答案。
  • 经过一番摸索后,如果您选择让脚手架向导也创建 MusicStoreDB 类,您似乎只会遇到问题。首先按照 Jan 的建议创建它,然后在下拉菜单中选择类,而不是单击 + 按钮来获取脚手架工具来为您创建它,这绝对是要走的路。我还了解到,在使用任何脚手架模板之前,您应该始终进行快速构建,这是养成的好习惯。我假设这会将任何新类名放入 Visual Studios 符号表中,以便脚手架工具可以找到它们。
【解决方案3】:

我遇到了同样的问题,并通过选择“数据上下文类:”从 {ConnectionName}Entities ({MyProject}.Models) 和 ApplicationDbContext ({MyProject}.Models) 中选择上下文来解决它。

【讨论】:

    【解决方案4】:

    我在 VS 2015 社区版上遇到了同样的问题。

    只有在 Album 类中注释掉以下内容时,我才能让脚手架工作:

    public virtual Genre  Genre { get; set; }
    public virtual Artist Artist { get; set; }
    

    搭建脚手架后,您可以取消注释并修复控制器和视图。

    【讨论】:

    • 我还必须删除相应属性的 ForeignKey 属性。
    【解决方案5】:

    移除外键属性:

    public virtual int GenreId { get; set; }
    public virtual int ArtistId { get; set; }
    

    【讨论】:

    • 我还必须删除相应属性的 ForeignKey 属性。
    【解决方案6】:

    早些时候我的同事正在使用 EF,并强调要使其正常工作,包和包的版本非常重要。如果没有完全正确,可能会出现各种不相关的错误消息,例如“密钥已经存在尝试使用 EF 时出现 in table error”消息。

    因为他们正在使用它,所以我决定阅读 wrox 书籍 Professional ASP.NET MVC 5 并且正在阅读第 4 章时遇到与大家相同的错误。无论如何,我从

    下载了他们的示例解决方案第 4 章>

    http://www.wrox.com/WileyCDA/WroxTitle/Professional-ASP-NET-MVC-5.productCd-1118794753,descCd-DOWNLOAD.html

    按照建议,我从他们的示例中复制包文件夹并替换我的项目中的包文件夹,它可以工作。创建 StoreManageController

    如果这对所有人都有效,请提供反馈。它对我有用。我正在使用 VS2015 Professional

    【讨论】:

    • 亲爱的,请在投反对票之前对其进行测试 :),因为我没有在网上看到任何适用于第 4 章 wrox 示例的有效解决方案,它对我有用。如果真的不起作用,那么它好的。我正在使用 VS2015 Professional。无论如何,如果它适合你,请投票并宣传。
    【解决方案7】:

    我的模型也遇到了这个问题。我刚刚将 [ForeignKey("")] 属性添加到密钥以使其工作。

    【讨论】:

    • 当我尝试查看 api 帮助页面上的示例时,这已编译但后来为我破坏了教程。将导航属性包装在 DbSet&lt;Album&gt; 中没有任何负面影响。
    【解决方案8】:

    我遇到了同样的问题“表中已存在密钥。”在 VS 2015 Pro 中,发现如果我关闭所有打开的代码窗口,运行清理然后重新构建并再次尝试脚手架选项,一切正常!

    【讨论】:

      【解决方案9】:

      在我的情况下,这是由于在“添加控制器”对话框中选择了不正确的数据上下文类造成的。我的项目满足了 2 个数据上下文类,我正在为一个模型类创建一个新控制器,该模型类已经在另一个数据上下文类中使用过。在我的情况下,数据上下文类的更改解决了这个错误(密钥已经存在...)。清理、重建、重新启动 VS(VS 2015 Pro)没有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-30
        • 1970-01-01
        • 2012-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-30
        相关资源
        最近更新 更多