Ключ ошибки уже существует в таблице, когда контроллер лесов vs2015

Я пытаюсь следовать примеру музыкального магазина в Профессиональном MVC 4, используя VS2015. У меня проблемы с контроллером музыкального магазина. Каждый раз, когда я пытаюсь создать контроллер, появляется окно ошибки, и единственная информация в нем: "Произошла ошибка с запущенным генератором кода:" Ключ уже существует в таблице ".

Я искал вокруг этих конкретных ошибок, но большинство решений об ошибках в области лесов выглядят как ошибки в файле web.config, но ничто не изменилось в моем web.config, оно по умолчанию создано, когда новый проект был создан.

Я попытался создать еще один проект MVC и снова кодировать модели, но я все еще получаю ошибку.

Я использую Microsoft Visual Studio Enterprise 2015 версии 14.0.247200 Update 1, если это помогает.

Классы, созданные мной в папке "Модели", выглядят следующим образом и находятся точно так же, как в книге:

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; }
}

Спасибо за помощь

Ответы

Ответ 1

У меня была та же проблема. Я использую Visual Studio Communitty 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 в качестве контекста.

Рабочий код можно найти здесь.

Код для главы 4 выглядит так, как будто он был создан из базы данных, поэтому класс MusicStoreDB несколько отличается.

Ответ 2

У меня были те же проблемы. "Ключ уже существует в таблице". в VS 2015 Pro и обнаружил, что если бы я закрыл все открытые окна кода, запустил чистую, а затем перестроил и снова попробовал вариант подкладок, все сработало отлично!

Ответ 3

Такая же проблема для меня в VS 2015 Community Edition.

Мне удалось заставить строительные леса работать, только если я прокомментировал следующее в классе Album:

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

После строительных лесов вы можете раскомментировать и исправить контроллер и просмотреть.

Ответ 4

Раньше мои коллеги работали с EF, и было подчеркнуто, что для правильной работы пакетов пакеты и версия пакетов очень важны. Если не все правильно, могут возникать различные несвязанные сообщения об ошибках, например, "Key уже существует" в сообщении об ошибке "при попытке использования EF.

Поскольку они используют его, я решил прочитать книгу 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

Теперь, пожалуйста, сделайте обратную связь, если это работает для all.It работал у меня. Я использую VS2015 Professional

Ответ 5

Вы уверены, что каждое свойство помечено как virtual в образцах? Я не вижу, как это имеет смысл для Name, Price и т.д., Чтобы быть свойствами навигации.

Попробуйте выполнить следующие действия, установив только свойства навигации (вещи с отношениями) в виртуальные.

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; }
}

Ответ 6

У меня была такая же проблема и разрешила ее, выбрав "Класс контекста данных": контекст из {ConnectionName} Entities ({MyProject}.Models). applicationDbContext ({MyProject}.Models).

Ответ 7

Удалите свойства внешнего ключа:

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

Ответ 8

В моем случае это было вызвано выбором неправильного класса контекста данных в диалоговом окне "Добавить контроллер". Мой проект удовлетворил 2 класса контекста данных, и я создавал новый контроллер для класса модели, который уже использовался в другом классе данных данных. Изменение класса контекста данных решило эту ошибку (ключ уже существует...) в моем случае. Очистка, перестройка, перезапуск VS (VS 2015 Pro) не помогли.

Ответ 9

Я тоже столкнулся с этой проблемой с моей моделью. Я просто добавил [ForeignKey ("")] атрибут к ключу, чтобы он работал.