2015-03-02 22 views
6

Tôi đã tạo cho ứng dụng, trước tiên với ODP.Net và không có Entity - hoạt động tốt.Oracle ODP.Net với khung thực thể 6 - ORA-00955 trên Chọn từ Bảng Xem

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 là chế độ xem.

Chương trình thứ hai đang sử dụng ODP.Net và EntityFramework và manaly tạo lớp DbSet (đã được thử nghiệm trên Npgsql.EntityFramework và hoạt động bản sao tuyệt vời, hoàn hảo của chế độ xem từ Oracle). Ứng dụng trả về lỗi: ORA-00955. Tôi nhận thấy rằng khi tên thay đổi của "Lược đồ" thành một tên không có chế độ xem 'ORDER', chương trình sẽ tạo bảng của tôi có cùng tên. Đây là sự khởi đầu của tôi về DbSet:

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

Có thể là sai. Nhưng tôi không biết cách xây dựng các thực thể sẽ có quyền truy cập vào chế độ xem này. Người dùng chỉ có quyền SELECT. Tôi muốn thực hiện các thao tác chỉ đọc.

+0

ORA-00955 là _name đã được sử dụng bởi lỗi object_ hiện có. Bạn có chắc đó là lỗi bạn đang nhận được không? – mmmmmpie

+0

Vâng, tôi chắc chắn. Dường như với tôi rằng vì lý do nào đó, ứng dụng của tôi muốn tạo một bảng như vậy, nhưng không thể vì có một khung nhìn. Tôi chỉ muốn đọc dữ liệu từ chế độ xem này. – BLuM

+0

Ok, chúng tôi cần xem mã đang nhận lỗi ứng dụng. – mmmmmpie

Trả lời

4

Triển khai thực hiện Oracle của nhà cung cấp Khung thực thể rất kém nhưng có một số cách để làm việc này.

  1. đơn giản nhưng gây phiền nhiễu - sử dụng NULL hoặc riêng cơ sở dữ liệu khởi tạo thực hiện:

    Database.SetInitializer<DatabaseContext>(null); 
    

hoặc

class DatabaseInitializer : IDatabaseInitializer<DatabaseContext> 
{ 
    public void InitializeDatabase(DatabaseContext context) 
    { 
     // your implementation 
    } 
} 

Database.SetInitializer(new DatabaseInitializer()); 

Đặt khởi tạo trước khi truy cập đầu tiên đến cơ sở dữ liệu của bạn.

  1. Nếu bạn muốn sử dụng di chuyển tạo chế độ xem và sau đó thêm di chuyển bằng cách bỏ qua các thay đổi, ví dụ: sử dụng bảng điều khiển gói add-migration initial -ignorechanges. Điều này sẽ làm cho EF bỏ qua những mâu thuẫn giữa lược đồ DB và mô hình (vì nó chỉ kiểm tra các bảng từ ALL_TABLES, không phải dạng xem) vì vậy nó sẽ không cố tạo bảng. Có một lỗi trong Oracle EF thực hiện rằng nếu di chuyển ban đầu trống rỗng nó sẽ giảm và tái tạo bảng __MigrationHistory để di chuyển ban đầu của bạn phải containt ít nhất một bảng trước khi bạn thêm di chuyển chế độ xem hoặc bạn cần thêm bảng sau đó.
+1

Database.SetInitializer (null); trong Global.asax – FrankSharp

Các vấn đề liên quan