Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Sử dụng chế độ xem không có khóa chính với Thực thể

Có thể thêm chế độ xem vào mô hình Thực thể mà không có mã định danh aunique không?

Nếu không có khóa chính, không. Điều đó sẽ dẫn đến loại lỗi này:

Một hoặc nhiều lỗi xác thực đã được phát hiện trong quá trình tạo mô hình:

System.Data.Edm.EdmEntityType::EntityType 'SalesOnEachCountry' không có khóa nào được xác định. Xác định khóa cho EntityType.System.Data.Edm.EdmEntitySet:EntityType:EntitySetSalesOnEachCountryList dựa trên loại SalesOnEachCountry có các phím được xác định.

Nếu không có số nhận dạng duy nhất, thì có, mặc dù nó có đầu ra không mong muốn. Các bản ghi có cùng số nhận dạng sẽ tham chiếu đến cùng một đối tượng, đây được gọi là Mẫu bản đồ nhận dạng

Một ví dụ, ngay cả khi chế độ xem của bạn tạo ra hai hàng sau:

Country     Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000

Nếu bạn chỉ ánh xạ khóa chính trên trường Quốc gia, ví dụ:

public class SalesOnEachCountry
{        
    [Key]
    public int CountryId { get; set; }
    public string CountryName { get; set; }        
    public int OrYear { get; set; }
    public long SalesCount { get; set; }
    public decimal TotalSales { get; set; }
}

, ngay cả khi chế độ xem của bạn tạo ra hai hàng trên trên trình soạn thảo truy vấn Oracle của bạn, Entity Framework tạo ra kết quả không chính xác này:

Country     Year TotalSales
Philippines 2010 20.000000
Philippines 2010 20.000000

Entity Framework sẽ coi hàng thứ hai là đối tượng giống với hàng đầu tiên.

Để đảm bảo tính duy nhất, bạn phải xác định những cột nào làm cho mỗi hàng là duy nhất. Trong ví dụ trên, Năm phải được bao gồm để khóa chính là duy nhất. tức là

public class SalesOnEachCountry
{        
    [Key, Column(Order=0)] public int CountryId { get; set; }
    public string CountryName { get; set; }
    [Key, Column(Order=1)] public int OrYear { get; set; }

    public long SalesCount { get; set; }      
    public decimal TotalSales { get; set; }
}

Làm cho khóa chính của bạn tương tự với các thuộc tính ở trên, Entity Framework có thể ánh xạ chính xác từng hàng trong chế độ xem của bạn với các đối tượng của riêng chúng. Do đó, Entity Framework hiện có thể hiển thị chính xác các hàng mà chế độ xem của bạn có.

Country     Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000

Chi tiết đầy đủ tại đây:http://www.ienablemuch.com/2011/06/mapping-class-to-database-view-with.html

Sau đó, liên quan đến chế độ xem của bạn không có bất kỳ cột nào để tạo một hàng duy nhất, cách dễ nhất để đảm bảo Khung thực thể có thể ánh xạ từng hàng trong chế độ xem của bạn với các đối tượng của riêng chúng là tạo một cột riêng cho khóa chính , một ứng cử viên tốt là chỉ cần tạo một cột số hàng trên mỗi hàng. ví dụ:

create view RowNumberedView as

select 
    row_number() over(order by <columns of your view sorting>) as RN
    , *
from your_existing_view

Sau đó chỉ định [Key] thuộc tính RN của class RowNumberedView của bạn



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ngoại lệ ORA-08103:đối tượng không còn tồn tại khi sử dụng setfetchsize của Hibernate

  2. Có giới hạn lồng cho các truy vấn con tương quan trong một số phiên bản của Oracle không?

  3. Cách đổi tên cột bảng trong Oracle 10g

  4. Giới thiệu về phương pháp thu thập PL / SQL trong cơ sở dữ liệu Oracle

  5. Quản trị cơ bản của Oracle 12c Multitenant