实体框架异常:指定的模式无效。

时间:2015-01-23 06:34:43

标签: c# oracle entity-framework

我使用oracle数据库在vs 2010中使用实体框架在Asp.net中工作。我从实体框架工作datacontext的代码提供连接字符串。这是我的代码:

public static string getConStrSQL()
    {

        //string connectionString = new System.Data.EntityClient.EntityConnectionStringBuilder
        string connectionString = new System.Data.EntityClient.EntityConnectionStringBuilder
        {
            Metadata = "res://*",
            Provider = "Oracle.ManagedDataAccess.Client",
            //Provider = "Oracle.DataAccess.Client",
            ProviderConnectionString = new System.Data.SqlClient.SqlConnectionStringBuilder
            {
                //InitialCatalog = "ORCL",
                DataSource = "MONOJ-PC:1521/ORCL",
                //IntegratedSecurity = false,
                UserID = "C##MONOJ",                 // User ID such as "sa"
                Password = "Thanks123",               // hide the password
            }.ConnectionString
        }.ConnectionString;

        return connectionString;
    }

    public List<CUSTOMER> GetCustomerList()
    {

        using (Entities db = new Entities())
        {
            db.Connection.ConnectionString = getConStrSQL();
            db.Connection.Open();

            var data = from p in db.CUSTOMERs
                       select p;

            db.Connection.Close();

            return data.ToList();
        }
    }

但是当我运行代码时,我得到以下错误:

  

指定的架构无效。错误:   错误0194:加载到ItemCollection中的所有工件必须具有相同的版本。遇到了多个版本。   DAL.DBModel.ssdl(2,46):错误0172:所有SSDL工件必须以同一提供程序为目标。提供商&#39; Oracle.DataAccess.Client&#39;不同于Oracle.DataAccess.Client&#39;那是早先遇到的。   DAL.DBModel.ssdl(2,89):错误0169:所有SSDL工件必须以同一提供程序为目标。 ProviderManifestToken&#39; 12.1&#39;不同于&#9.2; 9.2&#39;那是早先遇到的。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(3,4):错误0019:EntityContainer名称必须是唯一的。一个名为&#39; Schema&#39;的EntityContainer已定义。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(834,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.Table&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(844,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.TableColumn&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(870,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.View&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(882,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.ViewColumn&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(908,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.Function&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(933,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.Procedure&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(943,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.Parameter&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(967,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.Constraint&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(979,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.CheckConstraint&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(987,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.ConstraintColumn&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(996,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.ForeignKeyConstraint&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(1005,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.ForeignKey&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(1016,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.ViewConstraint&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(1031,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.TableTableConstraint&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(1044,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.ConstraintConstraintColumn&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(1057,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.ConstraintForeignKey&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(1070,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.FromForeignKeyColumn&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(1083,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.ToForeignKeyColumn&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(1096,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.TableTableColumn&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(1109,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.ViewViewColumn&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(1122,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.FunctionFunctionParameter&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(1135,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.ProcedureProcedureParameter&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(1148,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.ViewViewConstraint&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(1161,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.ViewConstraintConstraintColumn&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(1174,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.ViewConstraintForeignKey&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(1187,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.FromForeignKeyViewColumn&#39;已经定义了。   Oracle.ManagedDataAccess.src.EntityFramework.Resources.EFOracleStoreSchemaDefinition.ssdl(1200,4):错误0019:架构中的每个类型名称必须是唯一的。输入名称&#39; Oracle.ToForeignKeyViewColumn&#39;已经定义了。

我用谷歌搜索但无法得到任何答案。 请帮我。它是银色的。

2 个答案:

答案 0 :(得分:1)

检查您的项目引用 - 您可能包含一个“带来”它自己的数据库/模式的项目。如:

  • 项目A - &gt;拥有EF版本X,数据库project_a.edmx
  • 项目B - &gt;引用'Project A',EF版本Y,数据库project_b.edmx

版本X和Y可能不同。

这可能是由于根据.NET / EF版本生成的不同连接字符串 - 请参阅更多http://weblogs.asp.net/kencox/schema-specified-is-not-valid-error-on-upgrading-to-asp-net-4

答案 1 :(得分:1)

我知道这个answare已经很晚了,但我希望它可以作为未来的参考资料。

我遇到了同样的问题,我发现问题在于正确指定元数据:

string connectionString = new System.Data.EntityClient.EntityConnectionStringBuilder
{
    Metadata = "res://*/Models.ModelKDM.csdl|res://*/Models.ModelKDM.ssdl|res://*/Models.ModelKDM.msl",
    Provider = "Oracle.DataAccess.Client",
    ProviderConnectionString = new System.Data.SqlClient.SqlConnectionStringBuilder
    {
        DataSource = server,
        UserID = user,
        Password = pass,
    }.ConnectionString
}.ConnectionString;
return connectionString;