1

我们有大量的数据库都共享相同的模式。它们分布在许多 SQL Server 上,一些是 2005 年,一些是 2008 年。在连接到 2005 年服务器后,我们首先连接到 2008 年服务器时遇到异常,说明如下:

更新条目时出错。有关详细信息,请参阅内部异常。更新条目时出错。有关详细信息,请参阅内部异常。正在使用的 SQL Server 版本不支持数据类型“datetime2”。

据我了解,正在发生的事情是模型是根据 2008 SQL 服务器提供程序信息创建的,因此当连接到 2005 服务器时,它不能使用 DateTime2 数据类型,因为那里不支持。

我们想针对 2005 服务器构建模型,但我不确定如何指定连接字符串和 DbCompiledModel。以前我有几个构造函数接受连接字符串(以及其他参数)......

    public ProjectContext(string ConnectionString) : base(ConnectionString)
    {

        // Get the ObjectContext related to this DbContext
        var objectContext = (this as IObjectContextAdapter).ObjectContext;

        // ... does some stuff with the ObjectContext
    }

如何为所有上下文(最小公分母)指定针对 2005 服务器构建的编译模型并指定连接字符串?我只是暂时没有办法做到这一点。

任何帮助,将不胜感激。

编辑:我们使用的是 Entity Framework 4.3 Code First,因此,没有设计时 EDMX 文件可供编辑。

4

2 回答 2

2

基类构造函数有重载!

我将 OnModelCreating 配置内容复制到一个新方法中,该方法返回名为 BuildModel 的 DbCompiledModel。当调用具有 ConnectionString 构造函数的构造函数时,我得到 dbModel 的值,这是一个私有只读属性,如果为 null,则将其设置为从 BuildModel 返回的值。属性值与连接字符串一起被馈送到基类构造函数。

我可以访问要连接的 SQL Server 版本。最终,我会将其引入并为 2005 年和 2008 年创建一个模型。

我将把它打开一段时间,以防万一有更好的方法来做到这一点。

public DbContext ProjectContext (string ConnectionString) 
    : base(ConnectionString, dbModel)
{

}

private DbCompiledModel _dbModel;
private DbCompiledModel dbModel;
{
    get
    {
        if (_dbModel == null)
        {
            _dbModel = BuildModel(new DbModelBuilder());
        }
        return _dbModel;
    }
}

    private DbCompiledModel BuildModel(DbModelBuilder builder)
    {
        //Some configuration stuff
        return builder.Build(new DbProviderInfo("System.Data.SqlClient", "2005"))
                      .Compile();
    }
于 2012-09-06T02:51:59.157 回答
1

要回答第一个问题,您需要直接编辑edmx xml 文件,然后 在文件顶部的元素ProviderManifestToken上将属性从2008 更改为2005 。<Schema>

AFAIK,您需要为每个 .edmx 文件执行此操作,更糟糕的是,模型更新向导将ProviderManifestToken根据 EF 连接使用的 SQL 版本,在您每次从数据库更新模型时恢复。AFAIK EF 向导使用包含 edmx 的本地程序集中的连接字符串,因此如果您将该连接字符串更改为指向 SQL 2005 DB,您应该可以继续前进。

于 2012-09-05T15:48:25.593 回答