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

Не удается получить метаданные

MVC4 + Entity Framework 4.4 + MySql + POCO/Code First

Я настраиваю вышеуказанную конфигурацию. Вот мои классы:

namespace BTD.DataContext
{
public class BTDContext : DbContext
{

    public BTDContext()
        : base("name=BTDContext")
    {

    }

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

        //modelBuilder.Conventions.Remove<System.Data.Entity.Infrastructure.IncludeMetadataConvention>();
    }

    public DbSet<Product> Products { get; set; }

    public DbSet<ProductImage> ProductImages { get; set; }        


}
}

namespace BTD.Data
{
[Table("Product")]
public class Product
{
    [Key]
    public long ProductId { get; set; }

    [DisplayName("Manufacturer")]
    public int? ManufacturerId { get; set; }

    [Required]
    [StringLength(150)]
    public string Name { get; set; }

    [Required]
    [DataType(DataType.MultilineText)]
    public string Description { get; set; }

    [Required]
    [StringLength(120)]
    public string URL { get; set; }

    [Required]
    [StringLength(75)]
    [DisplayName("Meta Title")]
    public string MetaTitle { get; set; }

    [DataType(DataType.MultilineText)]
    [DisplayName("Meta Description")]
    public string MetaDescription { get; set; }

    [Required]
    [StringLength(25)]
    public string Status { get; set; }

    [DisplayName("Create Date/Time")]
    public DateTime CreateDateTime { get; set; }

    [DisplayName("Edit Date/Time")]
    public DateTime EditDateTime { get; set; }
}

[Table("ProductImage")]
public class ProductImage
{
    [Key]
    public long ProductImageId { get; set; }

    public long ProductId { get; set; }

    public long? ProductVariantId { get; set; }

    [Required]
    public byte[] Image { get; set; }

    public bool PrimaryImage { get; set; }

    public DateTime CreateDateTime { get; set; }

    public DateTime EditDateTime { get; set; }

}
}

Вот моя настройка web.config...

<connectionStrings>
<add name="BTDContext" connectionString="Server=localhost;Port=3306;Database=btd;User Id=root;Password=mypassword;" providerName="MySql.Data.MySqlClient" />
</connectionStrings>
  • База данных И таблицы уже существуют...
  • Я все еще довольно новичок в mvc, но использовал этот учебник

Приложение строит отлично... однако, когда я пытаюсь добавить контроллер с помощью Product (BTD.Data) в качестве моего класса модели и BTDContext (BTD.DataContext) в качестве моего класса контекста данных, я получаю следующую ошибку:

Невозможно получить метаданные для BTD.Data.Product, используя тот же DbCompiledModel для создания контекста для разных типов баз данных серверы не поддерживаются. Вместо этого создайте отдельный DbCompiledModel для каждого используемого сервера.

Я нахожусь в полной потере - я просмотрел google почти с каждым изменением этого сообщения об ошибке выше, о котором я могу думать, но безрезультатно.

Вот что я могу проверить...

  • MySql работает нормально
  • Я использую MySql Connector версии 6.5.4 и создал другие веб-формы ASP.net + приложения с фреймворком с проблемами ZERO.

Я также попытался включить/удалить это в своем web.config:

<system.data>
<DbProviderFactories>
  <remove invariant="MySql.Data.MySqlClient"/>
  <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.5.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>

Я буквально работал над этой ошибкой в ​​течение нескольких дней - я должен сейчас сказать, что я готов заплатить кому-то, чтобы решить ее. Ничего, шутка... Мне бы очень понравилось использовать MVC 4 и Razor - я был так взволнован, чтобы начать с этого, но теперь я очень обескуражен - я действительно ценю любую помощь/руководство по этому поводу.

Также обратите внимание - я использую Entityframework из Nuget...

Другое примечание

Я использовал шаблон визуальной студии по умолчанию, который создает ваш проект MVC со страницами учетных записей и другими материалами. Я просто удалил все ссылки на добавленные файлы, потому что они пытались использовать "DefaultConnection", которого не было, поэтому я думал, что эти файлы могут быть причиной того, что вызывало ошибку, - однако по-прежнему не повезло после их удаления -

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

ОБНОВЛЕНИЕ К ИСПОЛЬЗОВАНИЮ Базового шаблона VS MVC: Приведенная же ошибка - до сих пор нет решения

ДРУГОЙ ЧЕЛОВЕК, ОПЫТАЯ ЖЕ ЖЕ ПРОБЛЕМУ

Прямо здесь есть другой вопрос о стеке, который имитирует мой - однако я попробовал его решение безрезультатно - возможно, кто-то другой, у кого такая же проблема, может извлечь выгоду из ссылки

UPDATE

Недавно я просто попробовал поместить это в MS Sql Server, а вид scaffolding добавлен отлично, без ошибок - поэтому я не уверен, что его база данных MySql или строка подключения или что... вождение меня в орехи..

Другие ссылки

Похоже, что у кого-то есть те же проблемы, с которыми я столкнулся - единственное различие заключается в том, что они используют sql-сервер - я попытался настроить весь мой код, чтобы следить за предложениями this questionoverflow question/ответьте здесь, но все же безрезультатно

ВОЗМОЖНОЕ ИСПРАВЛЕНИЕ

Итак, это странно... после подключения к серверу MS Sql и добавления контроллера, а затем вернувшего строку подключения к MySql, на самом деле это РАБОТАЕТ с MySql... что за черт!??

Итак, кажется, что когда вы пытаетесь добавить свой контроллер и видимые леса (это то, что правильная фраза?) добавляется с строкой соединения mysql, она терпит неудачу... однако, если вы подключите ее к серверу db сервера, сгенерируйте строительные леса/контроллер, затем вернитесь к строке подключения mysql, которая работает...?!?!

4b9b3361

Ответ 1

Кажется, что MVC4 Controller scaffolding неправильно распознает строку подключения MySql. Измените строку подключения, как показано ниже, при генерации кода EF CRUD для контроллеров:

<connectionStrings>
    <add name="BTDContext" connectionString="Data Source=host_name;Database=database_name;uid=user_id;pwd=password;" providerName="System.Data.SqlClient" /> 
</connectionStrings>

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

<connectionStrings>
    <add name="BTDContext" connectionString="Data Source=host_name;Database=database_name;uid=user_id;pwd=password;" providerName="MySql.Data.MySqlClient" /> 
</connectionStrings>

Обратите внимание на изменение, имя поставщика.

Ответ 2

Imesh предлагает почти решить мою проблему, но, кроме того, я временно прокомментировал строку

[DbConfigurationType(typeof(MySqlEFConfiguration))]

который был в классе DBContext. И, конечно, после создания контроллера эта строка должна быть раскоментирована и изменить System.Data.SqlClient на MySql.Data.MySqlClient в файле конфигурации.

Ответ 3

Использование VS 2013, MySQL Connector/NET 6.9.6, Entity Framework 6, Web API 2.2 и сервера MySQL 5.7 Мне пришлось объединить ответы, чтобы предотвратить ошибку "Не удалось получить метаданные".

Чтобы успешно добавить контроллер в .NET-проект, который использует соединение MySQL, выполните следующие действия:

  • Временно добавьте строку подключения с System.Data.SqlClient в качестве providerName и прокомментируйте ее для MySQL. Не имеет значения, действительно ли строка соединения.
  • Убедитесь, что MySqlEFConfiguration не включен каким-либо образом.
  • Перестроить.

О втором пункте, Документация MySQL по использованию Connector/NET с EF6 содержит три возможных способа включения MySqlEFConfiguration. Убедитесь, что ни одна из них не включена при добавлении контроллеров с использованием шаблона VS.

  • Добавление атрибута DbConfigurationTypeAttribute в класс контекста:

[DbConfigurationType(typeof(MySqlEFConfiguration))]

  1. Вызов DbConfiguration.SetConfiguration(новый MySqlEFConfiguration()) при запуске приложения

  2. Задайте тип DbConfiguration в файле конфигурации:

<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">

Ответ 4

Я также тестировал эту ошибку и видел другую проблему.

Следующий код в моем Web.config(без него не работает):

<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">

Изменено:

<entityFramework>

Работает для меня... добавляет строительные леса, а затем меняет их.

Ответ 5

У меня была такая же проблема с использованием EF 4.3.1 и MySql Connecter/Net 6.6.4.0

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

Добавьте это между тегами entityFramework в файле web.config, когда вы хотите построить эшафот:

<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="Data Source=.\SQLEXPRESS; Integrated Security=True; MultipleActiveResultSets=True" />
  </parameters>
</defaultConnectionFactory>

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

Итак, вы будете выглядеть так:

<entityFramework>
  <contexts>
    <context type="ApptManager.Models.AppointmentsManagerContext, ApptManager">
      <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[ApptManager.Models.AppointmentsManagerContext, ApptManager], [ApptManager.Migrations.Configuration, ApptManager]], EntityFramework" />
    </context>
  </contexts>
  <!--<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
    <parameters>
      <parameter value="Data Source=.\SQLEXPRESS; Integrated Security=True; MultipleActiveResultSets=True" />
    </parameters>
  </defaultConnectionFactory>-->
</entityFramework>

Это довольно нелепо, как разработчикам .NET приходится перепрыгивать через несколько сложных обручей, чтобы заставить их работать.

Рабочий пример

https://github.com/dublinan/mvc-mysql-ef-example

Ссылки на мой проект github

Ответ 6

Используйте пространство имен System.ComponentModel.DataAnnotations и используйте атрибут [Key] для членов класса EDM.

Это сработало для меня.