Oracle ODP.Net与entity framework6 – 从表视图中选择ORA-00955

我已经创建了应用程序,首先使用ODP.Net而没有实体 – 效果很好。

static void Main(string[] args) { OracleConnection con = new OracleConnection(); //using connection string attributes to connect to Oracle Database con.ConnectionString = "user id=****;password=****;data source=" + "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=server.org.net)(PORT=1521))(CONNECT_DATA=(SERVER=dedicated)(SERVICE_NAME=ora1)))"; con.Open(); Console.WriteLine("Connected to Oracle" + con.ServerVersion); OracleCommand command = con.CreateCommand(); command.CommandText = "SELECT ITEM FROM TEST.ORDERS"; OracleDataReader reader = command.ExecuteReader(); while (reader.Read()) { Console.WriteLine("\t{0}", reader[0]); } reader.Close(); // Close and Dispose OracleConnection object con.Close(); con.Dispose(); Console.WriteLine("Disconnected"); Console.ReadKey(); } 

TEST.ORDERS是一个视图。

第二个程序正在使用ODP.Net和EntityFramework以及manaly创建的DbSet类(它在Npgsql.EntityFramework上进行了测试,效果很好,是Oracle完美的视图副本)。 应用程序返回错误:ORA-00955。 我注意到当“Schema”的名称更改为没有“ORDER”视图的名称时,程序会创建具有相同名称的表。 这是我对DbSet的开始:

 [Table("ORDERS", Schema = "TEST")] 

它可能是错的。 但我不知道如何构建可以访问此视图的实体。 用户只有SELECT权限。 我想做只读操作。

entity framework提供程序的Oracle实现非常差,但有一些方法可以使其工作。

  1. 简单但烦人 – 使用NULL或自己的数据库初始化程序实现:

     Database.SetInitializer(null); 

要么

 class DatabaseInitializer : IDatabaseInitializer { public void InitializeDatabase(DatabaseContext context) { // your implementation } } Database.SetInitializer(new DatabaseInitializer()); 

在首次访问数据库之前设置初始化。

  1. 如果要使用迁移,请创建视图,然后通过忽略更改添加迁移,例如使用包控制台add-migration initial -ignorechanges 。 这将使EF忽略数据库模式和模型之间的不一致(因为它仅检查来自ALL_TABLES表,而不检查视图),因此它不会尝试创建表。 Oracle EF实现中存在一个错误,如果初始迁移为空,则会丢弃并重新创建__MigrationHistory表,因此在添加视图迁移之前,初始迁移必须至少包含一个表,或者之后需要添加表。