2015-04-27 13 views
6

Tôi đang cố gắng sử dụng phương pháp mã khung thực thể đầu tiên để kết nối với cơ sở dữ liệu PostgreSQL và khi tôi sử dụng thuật sĩ mô hình dữ liệu thực thể trong studio trực quan để tạo lớp C# từ cơ sở dữ liệu, nó có thể tạo các lớp cho mỗi bảng trong cơ sở dữ liệu thành công, nhưng các khung nhìn trong cơ sở dữ liệu không thể được tạo ra. Entity Data Model Wizard http://linearbench.com:9000/lbstest/ef.png C# class generated http://linearbench.com:9000/lbstest/code.pngKhông thể tạo lớp C# từ chế độ xem PostgreSQL bằng cách sử dụng mã Npgsql + EF6 đầu tiên

Ai đó có thể cho tôi biết tôi đã làm sai ở đâu? Tôi sử dụng khung Entity 6.1.3, với Npgsql 2.2.5. Cơ sở dữ liệu PosgreSQL là phiên bản 9.3.6 được cài đặt trên máy chủ Ubuntu.

Cảm ơn

+1

Đây không phải là mã đầu tiên – VMAtm

+1

Xin chào VMAtm, xin vui lòng tư vấn, tôi đã chọn "Mã đầu tiên từ cơ sở dữ liệu" trong Trình hướng dẫn mô hình dữ liệu thực thể. – TerryLi

Trả lời

0

Tôi biết câu hỏi này là một chút cũ bây giờ, nhưng bệnh kêu vang ở đây cho bất kỳ ai khác có thể tìm kiếm giải pháp ở đây. Câu trả lời của tôi có thể không chính xác những gì câu hỏi đã được tìm kiếm, tuy nhiên, nó đã sufficed như một công việc xung quanh giải pháp cho tôi.

Vấn đề với chế độ xem là khung thực thể có khó khăn trong việc xác định cột khóa chính cho chúng. Trong Sql Server, bạn có thể sử dụng hàm ISNULL() để lừa EF nghĩ rằng cột là một cột quan trọng, nhưng hàm coalesce() tương đương trong postgres không đủ tốt cho EF. Tôi cũng đã cố gắng tạo cột id hàng tăng tự động, tham gia vào các bảng khác với các khóa chính, v.v. không may mắn với bất kỳ cái nào trong số này.

Tuy nhiên, một cái gì đó đã mô phỏng chức năng mà tôi cần đến khi có thể truy vấn quan điểm của tôi vào đối tượng xem của tôi là chỉ cần mở rộng lớp ngữ cảnh của bạn với các hàm gọi Database.SqlQuery và trả về nó như một truy vấn

Ví dụ:

Giả sử chế độ xem trong cơ sở dữ liệu của bạn, "foo", với cột id, bar, baz. Bạn có thể viết POCO của riêng bạn để giữ dữ liệu quan điểm như vậy

public class foo 
{ 
    public int id { get; set; } 
    public string bar { get; set; } 
    public string baz { get; set; } 
} 

và sau đó mở rộng lớp ngữ cảnh của bạn với một định nghĩa partial class như thế này

public partial class FooContext : DbContext 
{ 
    public IQueryable<foo> foo => 
     this.Database.SqlQuery<foo>("select * from foo").AsQueryable(); 
} 

Và sau đó bạn có thể truy vấn nó từ bối cảnh của bạn cũng giống giống như bất kỳ bảng nào khác

context.foo.where(x => id > 100).toList(); //etc,etc 

Bạn sẽ không thể chèn hoặc sử dụng bất kỳ khả năng bổ sung nào thường đi kèm với DbSet chuẩn, nhưng Chế độ xem thường là được sử dụng dưới dạng truy vấn chỉ đọc (trừ khi bạn sử dụng một số trình kích hoạt chèn đặc biệt) ...

Nhưng điều này sẽ cho bạn cuộc gọi cơ sở sẽ truy vấn toàn bộ khung nhìn và không truy cập cơ sở dữ liệu. có thể truy vấn được, vì vậy bạn có thể tự do gọi bất kỳ phần mở rộng LINQ nào khác trên đó, chẳng hạn như Nơi lọc nó đến kết quả bạn muốn.

Tôi di chuyển từ máy chủ sql sang postgres sql bằng cách sử dụng npgsql lib và sửa lỗi này cho phép chế độ xem của tôi hoạt động mà không phải thực hiện bất kỳ thay đổi nào đối với codebase của chương trình của tôi, và bất chấp thực tế là edmx sẽ không tạo ra các đối tượng xem của tôi do thiếu khóa chính (có thể nhận biết được).

Hy vọng điều này sẽ hữu ích!

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