Ключ ошибки уже существует в таблице, когда контроллер лесов 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 ("")] атрибут к ключу, чтобы он работал.