Възможно ли е изобщо да се добави изглед към модела на обекта без уникален идентификатор?
Ако няма първичен ключ, не. Това ще доведе до този вид грешка:
Една или повече грешки при валидиране бяха открити по време на генерирането на модел:
System.Data.Edm.EdmEntityType::EntityType 'SalesOnEachCountry' няма дефиниран ключ. Дефинирайте ключа за този EntityType.System.Data.Edm.EdmEntitySet:EntityType:EntitySetSalesOnEachCountryList се базира на тип SalesOnEachCountry, който има дефинирани ключове.
Ако без уникален идентификатор, да, макар че има нежелан изход. Записите със същия идентификатор ще препращат към същия обект, това се нарича шаблон на карта на идентичност
Пример, дори ако вашият изглед произвежда тези два реда:
Country Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000
Ако просто картографирате първичния ключ само в полето за държава, напр.
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; }
}
, дори вашият изглед произвежда горните два реда във вашия редактор на заявки на Oracle, Entity Framework произвежда този неправилен изход:
Country Year TotalSales
Philippines 2010 20.000000
Philippines 2010 20.000000
Entity Framework ще приеме, че вторият ред е същият обект като първия.
За да гарантирате уникалност, трябва да определите кои колони правят всеки ред уникален. В горния пример годината трябва да бъде включена, така че първичният ключ да е уникален. т.е.
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; }
}
Правейки основния ви ключ подобен на атрибутите по-горе, Entity Framework може правилно да съпостави реда на всеки изглед към техните собствени обекти. Следователно Entity Framework вече може да показва точно същите редове, които има вашият изглед.
Country Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000
Пълни подробности тук:http://www.ienablemuch.com/2011/06/mapping-class-to-database-view-with.html
След това що се отнася до вашите изгледи, които нямат колони, за да направите ред уникален, най-лесният начин да гарантирате, че Entity Framework може да съпостави всеки от реда на вашия изглед към техните собствени обекти, е да създадете отделна колона за първичния ключ<на вашия изглед. /em> , добър кандидат е просто да създадете колона с номер на ред на всеки ред. напр.
create view RowNumberedView as
select
row_number() over(order by <columns of your view sorting>) as RN
, *
from your_existing_view
След това задайте [Key]
атрибут на свойството RN на вашия class RowNumberedView