簡體   English   中英

實體框架無法保存生產環境中的更改

[英]Entity framework not saving changes in production enviroment

我正在編寫可與EF和MySql一起使用的桌面應用程序。 EF創建的每種類型都有到本地類型的映射。 當使用Visual Studio提供的單元測試框架測試包裝方法時,所有的測試都會運行-並且我看到信息進出數據庫。 但是,當我從為集成測試添加的臨時控制台程序運行相同的代碼時,EF拋出以下異常:

System.NullReferenceException: Object reference not set to an instance of an object.
   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, ProviderManifestNeed
ed 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, String& providerManifestToken, 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.ObjectContext.SaveChanges(SaveOptions options)
   at System.Data.Objects.ObjectContext.SaveChanges()
   at DataAccess.PhoneTypeAccess.AddNewPhoneType(PhoneType newPhoneType) in C:\Users\Mordechai\Desktop\Progaming\GitHub\VirtualGabbai\VirtGabbai\DataAccess\PhoneTypeAccess.cs:line 66
   at TempUI.Program.Main(String[] args) in C:\Users\Mordechai\Desktop\Progaming\GitHub\VirtualGabbai\VirtGabbai\TempUI\Program.cs:line 17

這是我在program.cs中運行的代碼

static void Main(string[] args)
        {
            try
            {
                PhoneTypeAccess.AddNewPhoneType(new PhoneType(1, "phone"));
                var blah = PhoneTypeAccess.GetPhoneTypeById(1);
                Console.WriteLine(blah.ToString());
                //Cache.CacheData.t_phone_types.AddObject(t_phone_types.Createt_phone_types(1, "some Type"));
                //var thingOne = t_people.Createt_people(1);
                //Cache.CacheData.t_people.AddObject(thingOne);
                //Cache.CacheData.SaveChanges();
                //PhoneNumberAccess.AddNewPhoneNumber(new PhoneNumber(1, "some number", new PhoneType(1, "some type")));
                //var test = PhoneNumberAccess.GetPhoneNumberById(1);
                //Console.WriteLine(test.ToString
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }

該測試包含以下代碼

[TestMethod()]
    public void AddNewPhoneTypeTest()
    {
        PhoneType newPhoneType = new PhoneType(21, "phonetype:21");
        PhoneTypeAccess.AddNewPhoneType(newPhoneType);
        PhoneType actual = PhoneTypeAccess.GetPhoneTypeById(21);
        Assert.IsTrue(newPhoneType.Equals(actual));
    }

並且被調用的代碼如下

 public static void AddNewPhoneType(PhoneType newPhoneType)
    {
        t_phone_types phoneTypeToAdd = PhoneTypeAccess.ConvertSingleLocalPhoneTypeToDbType(newPhoneType);
        Cache.CacheData.t_phone_types.AddObject(phoneTypeToAdd);
        Cache.CacheData.SaveChanges();
    }

當我在Cache.CacheData.SaveChanges()行進行調試時,進入以下代碼

/// <summary>
/// Allows access to the cached data - but only a single (and constant) instance of it
///  -[the code can create another one but it will be a completly different set of data]-
/// </summary>
public static class Cache
{
    // Data members
    private static zera_leviEntities m_dsDataSet = new zera_leviEntities();

    /// <summary>
    /// Allows outside access to the main data set
    ///  - without letting the user access it any other way
    /// </summary>
    public static zera_leviEntities CacheData
    {
        get
        {
            return m_dsDataSet;
        }
    }
}

我唯一能看到的是,在實體集中,確實沒有對象。 但是沒有跡象表明我為何四處張望,卻找不到任何幫助。 在執行此操作之前,我一直處於困境,所以希望有人可以幫助我,謝謝

編輯:在轉換方法中添加

private static t_phone_types ConvertSingleLocalPhoneTypeToDbType(PhoneType localTypePhoneType)
    {
        return t_phone_types.Createt_phone_types(localTypePhoneType._Id, localTypePhoneType.PhoneTypeName);
    }

t_phone_types.Createt_phone_types()方法是EF的一部分

編輯:現在,通過將整個解決方案中的引用更改為MySql Adapter的更新版本,我也設法打破了測試。現在,測試也引發了相同的異常。 另外在構建時,我收到以下錯誤:

Error 4: Could not load file or assembly 'MySql.Data, Version=6.7.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) C:\Users\Mordechai\Desktop\Progaming\GitHub\VirtualGabbai\VirtGabbai\Data\EntityCache.edmx

但是,它仍然會運行(只是拋出異常)

好吧..,經過反復嘗試,我設法找出了問題所在。 MySQl適配器分為兩個部分。 一個用於所有連接,另一個用於專門與EF連接。 現在,我添加了第二個dll,一切運行正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM