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实现非常差,但有一些方法可以使其工作。
-
简单但烦人 – 使用NULL或自己的数据库初始化程序实现:
Database.SetInitializer
(null);
要么
class DatabaseInitializer : IDatabaseInitializer { public void InitializeDatabase(DatabaseContext context) { // your implementation } } Database.SetInitializer(new DatabaseInitializer());
在首次访问数据库之前设置初始化。
- 如果要使用迁移,请创建视图,然后通过忽略更改添加迁移,例如使用包控制台
add-migration initial -ignorechanges
。 这将使EF忽略数据库模式和模型之间的不一致(因为它仅检查来自ALL_TABLES
表,而不检查视图),因此它不会尝试创建表。 Oracle EF实现中存在一个错误,如果初始迁移为空,则会丢弃并重新创建__MigrationHistory
表,因此在添加视图迁移之前,初始迁移必须至少包含一个表,或者之后需要添加表。