gpt4 book ai didi

c# - Entity Framework 不保存生产环境中的更改

转载 作者:行者123 更新时间:2023-11-30 01:12:11 25 4
gpt4 key购买 nike

我正在编写一个与 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 适配器的更新版本来破坏测试现在测试也抛出相同的异常。此外,在构建时出现以下错误:

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,一切都运行良好。

关于c# - Entity Framework 不保存生产环境中的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19382800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com