2015-02-23 17 views
8

I miei modelli EF simile a questa:ASP.NET Entity Framework 6 HashSet o Elenco per una raccolta?

public class ContentStatus 
{ 
    public ContentStatus() 
    { 
     this.Contents = new List<Content>(); 
    } 

    public int ContentStatusId { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Content> Contents { get; set; } 
} 

implementatins Tuttavia ho anche visto simile a questo:

public class ContentStatus 
{ 
    public ContentStatus() 
    { 
     this.Contents = new HashSet<Content>(); 
    } 

    public int ContentStatusId { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Content> Contents { get; set; } 
} 

Ecco il DDL per questo oggetto:

CREATE TABLE [dbo].[ContentStatus] (
    [ContentStatusId] INT   NOT NULL, 
    [Name]   NVARCHAR (50) NOT NULL, 
    CONSTRAINT [PK_ContentStatus] PRIMARY KEY CLUSTERED ([ContentStatusId] ASC) 
); 
Can

chiunque dimmi che dovrei usare o anche se c'è una differenza e quando dovrei usare la lista e quando Hashset se questo si applica.

Grazie

risposta

0

Quindi un HashSet<T> è definition

E un List<T> non avere tali capacità.

Quindi immagino che sia dovuto alle caratteristiche e alle prestazioni desiderate (che su piccoli gruppi è trascurabile). Possono entrambi essere elencati.

Le prestazioni (anche se probabilmente piccole differenze) saranno evidenti in due parti, leggere e scrivere. Come ha commentato Sean, ci saranno probabilmente penalità per le scritture dovute a calcoli di codici hash e confronti univoci. Ma le letture sono estremamente veloci (o(1)).

Quindi, davvero, tutto dipende dalle caratteristiche desiderate.

Nei miei progetti, vorrei usare List<T>, ma questo è il mio tipo di convenzione. Puoi determinare la tua convenzione, purché la segua.

+0

'HashSet' può essere ripetuto. Qualsiasi classe che implementa 'IEnumerable' può, ed entrambi' Lista 'e' HashSet 'la implementano. –

+0

@XavierPoinas risposta aggiornata ... dio sa da dove ho avuto quell'idea da ... –

+0

Suppongo che Hashset sarebbe più costoso per gli inserti, dal momento che assicura l'unicità e quindi deve essere confrontato con altre voci o almeno con gli hash, ma meno costoso per la rimozione (supponendo che un hash trovi gli oggetti più velocemente di quanto farebbe l'elenco di enumerazione). –

5

Dipende dal tuo caso d'uso ma nella maggior parte dei casi puoi aggiungere un elemento alla raccolta solo una volta perché ad esempio ogni stato viene applicato solo una volta a un contenuto. Dubito che tu possa avere un contenuto apparire due volte in uno stato. Pertanto HashSet è la struttura dati corretta in quanto impedisce i duplicati. Nel caso in cui un elemento possa essere duplicato, l'elenco sarebbe corretto ma non l'ho riscontrato nella pratica e non so nemmeno come EF lo gestirà.

Come nota a margine, consiglierei di non includere una raccolta di elementi nelle entità a meno che non ne abbiate bisogno. Ad esempio, se stai creando un'app Web per elencare i prodotti, probabilmente hai una vista in cui visualizzi un singolo prodotto insieme ai relativi tag. Pertanto, il prodotto dovrebbe avere una raccolta di tag per semplificare questo caso. Tuttavia probabilmente non hai una pagina che visualizza un Tag con la sua collezione di prodotti e quindi il Tag non dovrebbe avere una proprietà Products. Semplicemente non si preoccupa dei prodotti correlati. Sembra che questa entità di status non si preoccupi della sua collezione di contenuti.

Problemi correlati