EF6:使用Migration和ODP.NET创建表索引时遇到问题

时间:2015-07-30 12:39:38

标签: c# entity-framework plsql ef-migrations odp.net

我使用ODP.net与EntityFramework 6代码优先迁移。我在项目中安装了使用Oracle和EntityFramework的所有必要软件包。 我尝试创建表及其索引。 我的行动:

  1. 创建表格

    [Table("VSM_TP_REL")]
    public class DepRel
        {
        [Column("ID"), Key]
        public int Id { get; set; }
    
        [Column("FULLNAME", TypeName="varchar2"), Required, MaxLength(250)]
        public string FullName { get; set; }
    
        [Column("SEX", TypeName="varchar2"), Required, MaxLength(1), Index("IX_VSM_TP_REL")]
        public string Sex { get; set; }
    }
    
  2. 我添加了索引注释,因为我想为性别字段创建索引。

  3. 运行add-migration命令。没关系。
  4. 运行update-database -verbose命令并获取以下脚本:

    begin
      execute immediate
      'create index "PROD"."IX_VSM_TP_REL" on "PROD"."VSM_TP_REL" ("SEX")';
    exception
    when others then
      if sqlcode <> -1408 then
        raise;
      end if;
    end;
    
  5. 执行脚本后,我收到一条错误消息:

    System.Runtime.Serialization.SerializationException: Type is not resolved for member 'Oracle.ManagedDataAccess.Client.OracleException,Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342'.
       at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
       at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
       at System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force)
       at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
       at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
    Type is not resolved for member 'Oracle.ManagedDataAccess.Client.OracleException,Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342'.
    
  6. 问题1:执行任何pl / sql脚本时都会出现相同的错误。为什么?

    问题2:如何解决此问题?

    其他信息。

    为了获得真正的错误,我创建了一个新的控制台应用程序。

        static void Main(string[] args)
        {
    
            try
            {
                Database.SetInitializer(new MigrateDatabaseToLatestVersion<OracleDbContext, ConsoleApplication2.Migrations.Configuration>());
                var db = new OracleDbContext();                
                db.Database.Initialize(false);
                Console.WriteLine("Done.");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                Console.ReadLine();
            }
        }
    

    运行我的控制台应用程序后,我收到以下错误消息:

      

    PLS-00103:遇到符号&#34;&#34;当期待其中一个   以下内容:

         如果loop mod null pragma raise return,

    开始case声明退出goto   使用&lt;&lt;选择更新关闭当前删除获取锁定插入   open rollback savepoint set sql execute commit forall merge pipe。

    THIS ARTICLE的作者解释我收到此错误消息,因为ODP.NET不支持CR / LF对。他建议跑

    command.CommandText = sql.Replace("\r\n", "\n");
    

    但我可以将此代码放入系统迁移吗?

    问题:请告诉我,如何拦截脚本更新数据库并对其进行编辑?

1 个答案:

答案 0 :(得分:0)

我遇到了完全相同的问题,发现一篇关于Oracle的文章表明它在Oracle 10g数据库上会出错。

尝试使用11g版本。我不会在这个版本下出现这些错误。