我使用SQL 17和实体框架6。当我试图从数据库中获取一些数据时,我会得到这个异常。
An exception of type 'System.InvalidCastException' occurred in
EntityFramework.dll but was not handled in user code
Additional information: [A]Sap.Data.SQLAnywhere.SAConnection
cannot be cast to [B]Sap.Data.SQLAnywhere.SAConnection. Type A originates
from 'Sap.Data.SQLAnywhere.v4.5, Version=17.0.0.10624, Culture=neutral,
PublicKeyToken=f222fc4333e0d400' in the context 'Default' at
location 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Sap.Data.SQLAnywhere.v4.5
\v4.0_17.0.0.10624__f222fc4333e0d400\Sap.Data.SQLAnywhere.v4.5.dll'. Type B
originates from 'Sap.Data.SQLAnywhere.EF6, Version=17.0.0.10624,
Culture=neutral, PublicKeyToken=f222fc4333e0d400' in the context 'Default' at
location 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Sap.Data.SQLAnywhere.EF6
\v4.0_17.0.0.10624__f222fc4333e0d400\Sap.Data.SQLAnywhere.EF6.dll'.这是我的密码
public class SybaseConfiguration : DbConfiguration
{
public SybaseConfiguration()
{
SetProviderServices("Sap.Data.SQLAnywhere", SAProviderServices.Instance);
}
}
[DbConfigurationType(typeof(SybaseConfiguration))]
public partial class SomeDatabaseContext : DbContext
{ ... }
// Calling code,
using (var context = new SomeDatabaseContext(connectionString)
context.GetSomeRandomTable.ToList() // I get exception here.当我创建上下文对象时,只加载Sap.Data.SQLAnywehre.EF6。但是,当我调用GetSomeRandomTable时,它加载了Sap.Data.SQLAnywh.v4.5(它不应该加载),
调试器说,Sap.Data.SQLAnywh.v4.5和Sap.Data.SQLAnywhere.EF6都已加载。
注意,配置文件中没有任何内容。我是代码库配置。
发布于 2016-03-18 12:43:41
确保在App.config中没有这方面的配置部分,因为据我所知,EF无论如何都会加载它。
我就是这样,它运作得很完美:
public class SampleDbConfiguration : DbConfiguration
{
public SampleDbConfiguration()
{
// Set provider
SetProvider();
}
/// <summary>
/// Set Sql-Aynwhere as the current entity framework provider
/// </summary>
private void SetProvider()
{
// not required...
this.SetDefaultConnectionFactory(new SampleDBConnectionFactory());
this.SetProviderServices("iAnywhere.Data.SQLAnywhere", iAnywhere.Data.SQLAnywhere.SAProviderServices.Instance);
this.SetProviderFactory("iAnywhere.Data.SQLAnywhere", iAnywhere.Data.SQLAnywhere.SAFactory.Instance);
}
}只需将其替换为您的不变名称,因为我们使用的是sybase 16。还要确保您没有引用其他dll,也不通过(例如) LoadAssembly加载它。
编辑
这不是必需的,但允许您创建自己的DbConnection (如果您愿意的话)。
internal class SampleDBConnectionFactory : IDbConnectionFactory
{
/// <summary>
/// Create SA-DB Connection
/// </summary>
/// <param name="nameOrConnectionString">Name of complete connection string</param>
/// <returns>Instance of an SQL-Connection to a sybase db</returns>
public System.Data.Common.DbConnection CreateConnection(string nameOrConnectionString)
{
SAConnection connection = new SAConnection(ConnectionManager.GetConnectionString(nameOrConnectionString ?? "Default"));
return connection;
}
}希望能帮上忙。
https://stackoverflow.com/questions/36083763
复制相似问题