Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Używanie widoku bez klucza podstawowego z Entity

Czy w ogóle można dodać widok do modelu Entity bez unikalnego identyfikatora?

Jeśli bez klucza podstawowego, nie. To spowoduje tego rodzaju błąd:

Podczas generowania modelu wykryto jeden lub więcej błędów walidacji:

System.Data.Edm.EdmEntityType::EntityType „SalesOnEachCountry” nie ma zdefiniowanego klucza. Zdefiniuj klucz dla tego EntityType.System.Data.Edm.EdmEntitySet:EntityType:EntitySetSalesOnEachCountryList jest oparty na typie SalesOnEachCountry, który nie ma zdefiniowanych kluczy.

Jeśli bez unikalnego identyfikatora, tak, chociaż ma niepożądane wyjście. Rekordy o tym samym identyfikatorze odwołują się do tego samego obiektu, nazywa się to wzorcem mapy tożsamości

Na przykład, nawet jeśli widok zawiera te dwa wiersze:

Country     Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000

Jeśli zmapujesz klucz podstawowy tylko w polu Kraj, np.

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; }
}

, nawet widok tworzy powyższe dwa wiersze w edytorze zapytań Oracle, Entity Framework generuje niepoprawne dane wyjściowe:

Country     Year TotalSales
Philippines 2010 20.000000
Philippines 2010 20.000000

Entity Framework przyjmie, że drugi wiersz jest tym samym obiektem co pierwszy wiersz.

Aby zagwarantować niepowtarzalność, musisz określić, jakie kolumny sprawiają, że każdy wiersz jest unikalny. W powyższym przykładzie należy podać rok, aby klucz podstawowy był unikalny. czyli

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; }
}

Dzięki temu, że klucz podstawowy jest podobny do powyższych atrybutów, Entity Framework może poprawnie mapować wiersz każdego widoku na własne obiekty. W związku z tym Entity Framework może teraz wyświetlać dokładnie te same wiersze, które ma Twój widok.

Country     Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000

Pełne szczegóły tutaj:http://www.ienablemuch.com/2011/06/mapping-class-to-database-view-with.html

Następnie w odniesieniu do widoków, które nie mają żadnych kolumn, aby wiersz był unikalny, najprostszym sposobem zagwarantowania, że ​​Entity Framework może zmapować każdy wiersz widoku do ich własnych obiektów, jest utworzenie oddzielnej kolumny dla klucza podstawowego , dobrym kandydatem jest po prostu utworzenie kolumny z numerem wiersza w każdym wierszu. np.

create view RowNumberedView as

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

Następnie przypisz [Key] atrybut we właściwości RN Twojej class RowNumberedView



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SPRAWDŹ ograniczenie daty urodzenia?

  2. Oracle:Jak liczyć wiersze o wartości NULL i NULL?

  3. Oracle (stare?) Joins — narzędzie/skrypt do konwersji?

  4. Powiązanie parametrów zapytania według nazwy z ODP.NET

  5. Oracle:wydajność zbierania zbiorczego