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