Не удается получить метаданные
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, которая работает...?!?!
Ответы
Ответ 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))]
-
Вызов DbConfiguration.SetConfiguration(новый MySqlEFConfiguration()) при запуске приложения
-
Задайте тип 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.
Это сработало для меня.