2012-03-15 32 views
5

Tôi đang cố gắng làm việc với EF CodeFirst trong Oracle với ODP.net. Đây là lớp DbContext tôi:Làm thế nào để cấu hình DbContext để làm việc với Oracle ODP.Net và EF CodeFirst?

public class MyCEContext : DbContext { 

    public DbSet<Person> Persons { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
     modelBuilder.Entity<Person>().ToTable("PERSONS","myce"); 

    } 

    public MyCEContext() : 
     base(new OracleConnection(
      "Data Source=cebd; User ID=myce; Password=****;"), true) {} 

} 

Vấn đề là khi tôi cố gắng để làm một cái gì đó như thế này:

MyCEContext context = new MyCEContext(); 
Person p = context.Persons.Find(1); 

tôi nhận được lỗi bên này:

{"ORA-00942: table or view does not exist"} 

Và bàn tồn tại.

Tôi đang làm gì sai?

Trả lời

6

Như Nick đã viết trong câu trả lời của mình, vấn đề này có liên quan với các dấu ngoặc kép và trường hợp của truy vấn được tạo ra, nhưng không phải với tên của bảng nhưng với tên schema của:

SELECT * 
FROM "myce"."PERSONS" "Extent1" 

Vì vậy, các giải pháp rất đơn giản, chỉ để viết hoa tên người dùng và tên lược đồ:

modelBuilder.Entity<Person>().ToTable("PERSONS","MYCE"); 

Nói chung, tất cả phải bằng chữ hoa: bảng, lược đồ và tên trường. Nhưng tốt hơn là chú thích mỗi thuộc tính được ánh xạ với thuộc tính Cột thay vì viết hoa tên thuộc tính:

[Column("FIRST_NAME")] 
    public string FirstName { get; set; } 

Do đó tên sẽ dễ đọc hơn trong cả cơ sở dữ liệu và lớp học.

+0

Tôi có cả lớp và thuộc tính với chú thích dữ liệu với chữ hoa/Tên cột tương ứng và chúng vẫn không hoạt động. Sử dụng DbSet.Find không hoạt động, tuy nhiên, DbSet.SingleOrDefault() làm –

+0

Bạn có thể đặt một số mã từ các lớp hoặc ánh xạ của bạn không? – fcaldera

+0

dường như là lỗi đánh máy trong một trong các thuộc tính chú thích bảng, do đó DbSet.Find duyệt qua tất cả các lớp và ánh xạ chúng tới các bảng của chúng trong khi sử dụng SingleOrDefault() chỉ ánh xạ khi chạy các bảng cần thiết cho truy vấn đó. lỗi đánh máy. Tôi đã nghĩ rằng kể từ khi SingleOrDefault làm việc tất cả các tên bảng là tốt. Vì vậy, câu chuyện dài ngắn, Tìm bản đồ toàn bộ các danh sách đối tượng DbContext của bạn. –

3

Vấn đề của bạn rất có thể vì EF chuyển truy vấn tới Oracle trong dấu ngoặc kép, điều đó có nghĩa là trường hợp trên bảng và trường của bạn phải khớp với cơ sở dữ liệu.

Vì vậy, nếu bạn có điều sau đây:

select name from persons; 

Mã EF có thể sẽ được bắn SQL sau đây:

select "NAME" from "PERSONS"; 

Thêm phần này vào chức năng OnModelCreating của bạn:

modelBuilder.Conventions.Remove<ColumnTypeCasingConvention>(); 

... và xây dựng đối tượng POCO của bạn với các tên thuộc tính chữ hoa hơn là ký tự bình thường c ase.

Nếu bạn muốn xem SQL, hãy ngắt mã và xem xét đối tượng DbContext.Persons. Bạn sẽ thấy các lệnh thực tế sql nó sẽ sử dụng để truy vấn toàn bộ bảng (khá lớn)

Note

Chúng tôi sử dụng Oracle EF Mã đầu tiên trong sản xuất. Mặc dù không được hỗ trợ chính thức, dường như không có bất kỳ điều gì bị thiếu trong bản phát hành ODAC mới nhất sẽ ngăn bạn.

+0

Xin chào Nick, cảm ơn bạn đã trả lời. Vấn đề nằm trong tên lược đồ. Nó cần phải được viết hoa. Và tôi đồng ý với ghi chú của bạn. – fcaldera

1

Bạn có thể gọi ToString trên truy vấn LINQ mà bạn chạy đối với đối tượng dbcontext của mình. Điều này sẽ cho bạn thấy SQL được tạo ra.Điều đó sẽ giúp bạn tìm thấy những vấn đề

Vấn đề của tôi đã hai lần: "dbo"

  1. tên bảng của tôi đã được thành số nhiều
  2. tên bảng của tôi đã được mở đầu với
0

Nếu bạn không muốn ánh xạ mọi cột của ứng dụng dưới dạng giải pháp cho vấn đề trích dẫn, được đề cập bởi @fcaldera, bạn có thể sử dụng nhà cung cấp "Devart's dotConnect for Oracle".

Và chỉ đoạn mã sau là cần thiết:

Devart.Data.Oracle.Entity.Configuration.OracleEntityProviderConfig config = 
       Devart.Data.Oracle.Entity.Configuration.OracleEntityProviderConfig.Instance; 

      config.Workarounds.DisableQuoting = true; 

Bây giờ bạn có thể ánh xạ một lớp "MyObject" tới MyObject bảng mà không có vấn đề. Và nó cũng tương tự đối với các cột.

Lưu ý: Phiên bản NuGet của "dotConnect for Oracle" không hỗ trợ Khung thực thể. Cần tải xuống bản dùng thử hoặc phiên bản chuyên nghiệp từ trang web của Devart.

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