Oracle
 sql >> база данни >  >> RDS >> Oracle

Използване на изглед без първичен ключ с Entity

Възможно ли е изобщо да се добави изглед към модела на обекта без уникален идентификатор?

Ако няма първичен ключ, не. Това ще доведе до този вид грешка:

Една или повече грешки при валидиране бяха открити по време на генерирането на модел:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Зареждане на данни от текстов файл в таблица в oracle

  2. Тип на Java за дата/час, когато използвате Oracle Date с Hibernate

  3. ORACLE SQL:Попълнете липсващите дати

  4. SQLFiddle повреден ли е? Грешки за Oracle, SQL Server, ...?

  5. Пример за функция на Oracle (Номер за връщане)