Подтвердить что ты не робот

Контроллер лесов не работает с обновлением версии 3 и 4 на Visual Studio 2013

Мне не удалось подделать контроллер (MVC5 Controller с представлениями, используя Entity Framework) в Visual Studio 2013 (обновление 3 и 4). Сообщение об ошибке ниже:

Произошла ошибка с запуском генератора кода:

A configuration for type 'Library.Morthwind.Models.Catgeory' has already been added. To reference the existing configuration use the Entity<T>() or ComplexType<T>() methods

Я создал модели, выбрав "Обратный код инженера первым" в меню инструмента "Инструментальные средства инструментария Entity Framework Beta 4".

Любые идеи о том, что может вызвать эту ошибку?

4b9b3361

Ответ 1

У меня была такая же проблема сегодня.

Я добавил некоторую настраиваемую конфигурацию для одного из моих классов Model, чтобы добавить отношения, используя свободный API. Это было указано в моем классе dbContext в переопределении OnModelCreating, используя следующее:

modelBuilder.Configurations.Add(new OrderConfiguration());

Комментируя вышеприведенную строку, допустимо, чтобы строительные леса Controller выполнялись, как ожидалось.

В обновлении VS 2013 версии 2 возникла проблема с этим, и на строительных платформах появилась бесполезная ошибка без дополнительной информации. В установленном обновлении 3 и он дал достаточно подробностей для отслеживания основной проблемы.

Джефф.

Ответ 2

У меня тоже была эта проблема. Решение Jeff работает в некоторых случаях. Но по мере того, как мой DbContext рос с большим количеством моделей, которым нужно было сопоставлять ключи, я не мог удалить методы Configurations.Add(), потому что тогда я получил ошибки, которые EF не смог найти первичные ключи и т.д.

Я обнаружил, что, изменив свой производный класс DBContext на использование свойств IDbSet вместо DbSet, я мог бы генерировать контроллеры и представления просто отлично. Однако для меня это привело к другой проблеме, IDbSet не поддерживает методы async.

Кажется, я могу либо генерировать неасинхронные контроллеры с настройками на месте, либо с помощью асинхронных методов без классов конфигурации.

Если ваши свойства контекста имеют тип DbSet, попробуйте изменить их на IDbSet. Если вы не создаете методы контроллера async, это может сработать для вас.

Ответ 3

У меня также была такая же проблема и изменение моего контекстного класса для использования IDbSet позволило мне успешно использовать строительные леса для создания нового контроллера. Но так как я не хотел отказываться от асинхронных методов, я изменил контекст, чтобы использовать DbSet, и это сработало для меня.

Ответ 4

Вот как я решил эту проблему. У меня есть обновление Visual Studio 2013 4.
Я использую EF Power Tools. Комментируйте все DbSet <... > Внутри OnModelCreating оставите объект, на котором вы строите леса:           modelBuilder.Configurations.Add(новый SomeTableDataMap());

В нижней части моего контекстного класса я заметил, что это создано:       public System.Data.Entity.DbSet SomeTableDatas {get; задавать; }

О: Я также поместил это в свой конструктор, но это для чего-то еще,           this.Configuration.LazyLoadingEnabled = false;

Серьезно, сегодня это работало, я пробовал все эти решения, ничего не работало для обновления 4. У меня это работало в "Обновление 2" и "Обновление 3" с использованием предыдущих решений. Это самое современное решение.

Ответ 5

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

В диалоговом окне лесов я просто добавил новый DataContext, например. TempContext. Все строительные леса работали как ожидалось, а затем я мог просто переместить сгенерированный код в TempContext в исходный DbContext и переименовать TempContext в сгенерированных контроллерах в исходный DbContext.

Ответ 6

В этой проблеме уже много обходных решений. И в этом комментарии я попытаюсь дать основной вопрос, почему это может быть неудачным. [С надеждой информировать людей о первопричине]

Скажем, у вас есть DbContext (конкретный, дочерний класс DbContext) в вашем приложении, и вы пытаетесь использовать класс модели (пусть и модель), а также контроллеры и представления DbContext и леса.

Я предполагаю, что у DbContext не было свойства DbSet & Model Model (get; set;} ", но DbSet был добавлен в DbContext, используя код в методе OnModelCreating.

В приведенном выше случае строительные леса сначала пытаются обнаружить свойство DbSet в DbContext (только с помощью отражения - так, чтобы не обнаруживать, имеет ли OnModelCreating код для добавления DbSet), и если это не так, строительные леса добавляют свойство DbSet к DbContext и затем пытается выполнить эстафот с использованием этого DbContext, однако при запуске scaffolding мы создаем экземпляр DbContext, и мы также вызываем OnModelCreating, и в этот момент scaffolding терпит неудачу, потому что в DbContext есть несколько типов DbSet с той же моделью (одна добавлена леса и один, сконфигурированный в коде в OnModelCreating).

[Это происходит не только для используемой модели, но и для связанных моделей в этой модели, строительные леса добавляют свойства DbSet для всех связанных моделей]

[Также не отображается добавленный DbSet после того, как строительные леса были сделаны, потому что строительные леса откатывают любые изменения, если операция не завершилась успешно, как сказал Джефф, сообщение об ошибке было плохой изначально и было улучшено, чтобы дать некоторый намек для пользователя, но он все еще не очень понятен, что происходит]

Это ошибка в строительных лесах, простая работа будет заключаться в использовании свойства DbSet в DbContext для всех связанных моделей вашего модельного класса вместо их настройки в OnModelCreating.

Ответ 7

У меня возникала другая ошибка при попытке поднять контроллер с помощью CRUD-действий и представлений. В моем случае он говорил:

"Произошла ошибка с запуском генератора кода. не установлен в экземпляр объекта."

Проблема была трудно найти: я создал таблицу в SQL Server, но забыл установить Primary Key для таблицы. Установка Primary Key и обновление файла Entity Framework .edmx решила проблему.

Надеюсь, что это поможет.

Ответ 8

Ни один из остальных ответов не работал у меня. То, что я узнал, было то, что проблема произошла только при создании лесов и добавлении конфигураций с использованием Fluent API. Так что я сделал, а не разделял файлы, каждый из которых имел конфигурацию Entity, подобную этой:

public class ApplicationUserMapConfiguration : EntityTypeConfiguration<ApplicationUserMap>
{
    public ApplicationUserMapConfiguration()
    {
        ToTable("ApplicationUserMap", "Users");
        HasKey(c => c.Id);
     }
}

Затем добавив эту конфигурацию в DbContext:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Configurations.Add(new ApplicationUserMapConfiguration()); 
}

Я просто добавил всю конфигурацию внутри DbContext для каждого объекта:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        //ApplicationUser

        modelBuilder.Entity<ApplicationUser>().HasKey(c => c.Id);
        modelBuilder.Entity<ApplicationUser>().ToTable("ApplicationUser", "Usuario");

        //Other entities...
    }

Теперь я могу отлично подняться. Я уже отправил и выпустил в Mvc GitHub.

Кроме того, если возникает еще одно сообщение об ошибке:

Произошла ошибка при запуске выбранного генератора кода: "Исключение было выбрано целью вызова.

Вы должны изменить свой конструктор DbContext на:

public YourDbContext() : base("YourDbContext", throwIfV1Schema: false) { }

Ответ 9

Ни один из ответов этого сообщения не работал у меня. Я обработал эту проблему, создав новую кнопку контекстного класса через плюс в диалоговом окне Add Controller scaffolding. После того как VS создал контроллер и представления, я просто удаляю созданный класс контекста и изменяю сгенерированный код контроллера для использования моего существующего класса контекста.

Важно. Этот процесс добавит новую строку подключения для нового контекста, не забудьте также удалить ее.

Ответ 10

мой был зафиксирован следующим образом:

    public virtual DbSet<Category> Categories { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //--> EntityTypeConfiguration<Your Model Configuration>
        modelBuilder.Configurations.Add(new EntityTypeConfiguration<CategoryMapping>());  

        base.OnModelCreating(modelBuilder);
    }

Не забывайте Ctrl + Shift + B, чтобы скомпилировать ваш код (я не уверен, что для одного решения, но поскольку мой находится в другом проекте в том же решении, он должен сначала скомпилироваться)

Ответ 11

Я решил это, добавив try/catch в код к функции OnModelCreating внутри класса контекста. Просто держите  base.OnModelCreating(MODELBUILDER);

вне вашей попытки/catch