MySQL с Entity Framework - что я делаю не так? - PullRequest
7 голосов
/ 15 октября 2010

Я совершенно новичок в Entity Framework и даже в ADO.NET в целом (обычно не очень много работаю с базами данных).

  1. Я скачал и установил MySQL Connector / NET 6.3.5 .
  2. Я создал новый проект C # в Visual Studio 2010.
  3. Я добавил новую модель данных сущности ADO.NET в свой проект и выбрал «Создать из базы данных».
  4. Я добавил новое подключение к своему локальному серверу MySQL с именем сервера "localhost" + мое имя пользователя и пароль.
  5. Я проверил все таблицы из базы данных MySQL, чтобы сгенерировать объекты для них.
  6. Я написал следующий код:

(things - просто фиктивная таблица, которую я бросил вместе с некоторыми произвольными полями.)

TestDataEntities entities = new TestDataEntities();

var things = entities.things.Execute(MergeOption.AppendOnly); // exception

Выше было выброшено NullReferenceException, и я действительно не понимаю, почему это может быть. Когда я проверяю соединение, оно говорит, что оно успешно. Я определенно установил соединение с правильным именем пользователя и паролем. Я даже не знаю, что еще расследовать.

Для тех из вас, кто на самом деле знает об этом, вот исключение, которое я получил (хотя, на мой неопытный взгляд, на самом деле это не выглядит так, как будто это было бы очень полезно):

   at MySql.Data.MySqlClient.MySqlClientFactory.get_MySqlDbProviderServicesInstance()
   at MySql.Data.MySqlClient.MySqlClientFactory.System.IServiceProvider.GetService(Type serviceType)
   at System.Data.Common.DbProviderServices.GetProviderServices(DbProviderFactory factory)
   at System.Data.Metadata.Edm.StoreItemCollection.Loader.InitializeProviderManifest(Action`3 addError)
   at System.Data.Metadata.Edm.StoreItemCollection.Loader.OnProviderManifestTokenNotification(String token, Action`3 addError)
   at System.Data.EntityModel.SchemaObjectModel.Schema.HandleProviderManifestTokenAttribute(XmlReader reader)
   at System.Data.EntityModel.SchemaObjectModel.Schema.HandleAttribute(XmlReader reader)
   at System.Data.EntityModel.SchemaObjectModel.SchemaElement.ParseAttribute(XmlReader reader)
   at System.Data.EntityModel.SchemaObjectModel.SchemaElement.Parse(XmlReader reader)
   at System.Data.EntityModel.SchemaObjectModel.Schema.HandleTopLevelSchemaElement(XmlReader reader)
   at System.Data.EntityModel.SchemaObjectModel.Schema.InternalParse(XmlReader sourceReader, String sourceLocation)
   at System.Data.EntityModel.SchemaObjectModel.Schema.Parse(XmlReader sourceReader, String sourceLocation)
   at System.Data.EntityModel.SchemaObjectModel.SchemaManager.ParseAndValidate(IEnumerable`1 xmlReaders, IEnumerable`1 sourceFilePaths, SchemaDataModelOption dataModel, AttributeValueNotification providerNotification, AttributeValueNotification providerManifestTokenNotification, ProviderManifestNeeded providerManifestNeeded, IList`1& schemaCollection)
   at System.Data.Metadata.Edm.StoreItemCollection.Loader.LoadItems(IEnumerable`1 xmlReaders, IEnumerable`1 sourceFilePaths)
   at System.Data.Metadata.Edm.StoreItemCollection.Init(IEnumerable`1 xmlReaders, IEnumerable`1 filePaths, Boolean throwOnError, DbProviderManifest& providerManifest, DbProviderFactory& providerFactory, Memoizer`2& cachedCTypeFunction)
   at System.Data.Metadata.Edm.StoreItemCollection..ctor(IEnumerable`1 xmlReaders, IEnumerable`1 filePaths)
   at System.Data.Metadata.Edm.MetadataCache.StoreMetadataEntry.LoadStoreCollection(EdmItemCollection edmItemCollection, MetadataArtifactLoader loader)
   at System.Data.Metadata.Edm.MetadataCache.StoreItemCollectionLoader.LoadItemCollection(StoreMetadataEntry entry)
   at System.Data.Metadata.Edm.MetadataCache.LoadItemCollection[T](IItemCollectionLoader`1 itemCollectionLoader, T entry)
   at System.Data.Metadata.Edm.MetadataCache.GetOrCreateStoreAndMappingItemCollections(String cacheKey, MetadataArtifactLoader loader, EdmItemCollection edmItemCollection, Object& entryToken)
   at System.Data.EntityClient.EntityConnection.LoadStoreItemCollections(MetadataWorkspace workspace, DbConnection storeConnection, DbProviderFactory factory, DbConnectionOptions connectionOptions, EdmItemCollection edmItemCollection, MetadataArtifactLoader artifactLoader)
   at System.Data.EntityClient.EntityConnection.GetMetadataWorkspace(Boolean initializeAllCollections)
   at System.Data.EntityClient.EntityConnection.InitializeMetadata(DbConnection newConnection, DbConnection originalConnection, Boolean closeOriginalConnectionOnFailure)
   at System.Data.EntityClient.EntityConnection.Open()
   at System.Data.Objects.ObjectContext.EnsureConnection()
   at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
   at System.Data.Objects.ObjectQuery`1.Execute(MergeOption mergeOption)
   at EntityFrameworkTest.Form1..ctor() in D:\Development\EntityFrameworkTest\Form1.cs:line 23
   at EntityFrameworkTest.Program.Main() in D:\Development\EntityFrameworkTest\Program.cs:line 18
   at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

Ответы [ 5 ]

14 голосов
/ 30 октября 2010

Я получил эту ошибку, добавив ссылку на MySql.Data.Entity.dll (и MySql.Web.dll)

2 голосов
/ 07 мая 2011

Хорошие новости!Эта проблема была решена в MySQL Connector / NET 6.3.6 Обновите MySql Connector для решения проблемы.

2 голосов
/ 15 октября 2010

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

1 голос
/ 10 января 2011

В свойстве MySqlClientFactory-> MySqlDbProviderServicesInstance. Это ссылка на задницу: MySql.Data.Entity использовать код

string str = Assembly.GetExecutingAssembly().FullName.Replace("MySql.Data", "MySql.Data.Entity");

Но в MySql Client 6.3.5 версия MySqlData - 6.3.5, а версия MySql.Data.Entity - 6.3.4 (в папке \ Program Files \ MySQL \ MySQL Connector Net 6.3.5 \ Assemblies \ v2.0 ). так что он не может загрузить его успешно.

В папке (\ Program Files \ MySQL \ MySQL Connector Net 6.3.5 \ Assemblies \ v4.0) версия MySql.Data.Entity - 6.3.5, поэтому загрузка может быть успешной.

Таким образом, один способ - изменить цель на .NET 4.0, а другой - откатить MySql.Data обратно до 6.3.2 / 6.1.2.

1 голос
/ 15 октября 2010

Ну, я не знаю, так ли это должно быть или нет (если это так, я немного смущен - хотя в свою защиту я нигде не вижу, это ясно указано);но, похоже, проблема была в том, что у меня была целевая платформа, установленная на .NET 3.5 .После изменения целевой структуры моего проекта (честно говоря, по прихоти) на .NET 4.0, NullReferenceException ушел.

Так что, как бы неудовлетворительно это ни было, это, кажется, было решением в моем случае.

...