首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用实体框架时加载多个Sybase dll。

使用实体框架时加载多个Sybase dll。
EN

Stack Overflow用户
提问于 2016-03-18 11:57:51
回答 1查看 856关注 0票数 0

我使用SQL 17和实体框架6。当我试图从数据库中获取一些数据时,我会得到这个异常。

代码语言:javascript
复制
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'.

这是我的密码

代码语言:javascript
复制
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都已加载。

注意,配置文件中没有任何内容。我是代码库配置。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-18 12:43:41

确保在App.config中没有这方面的配置部分,因为据我所知,EF无论如何都会加载它。

我就是这样,它运作得很完美:

代码语言:javascript
复制
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 (如果您愿意的话)。

代码语言:javascript
复制
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;
    }
}

希望能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36083763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档