Indexy (vč. unikátních) v Entity Frameworku (EF6.1)

Při studiu zdrojových kódu knihovny Microsoft.AspNet.Identity.EntityFramework.dll jsem narazil na zápis, který mi připomněl novinku v Entity Frameworku 6.1 – možnost definovat entitám indexy, včetně těch unikátních.

Principiálně jde o použití data-annotation atributu [Index(„<index name>“, [isUnique: true|false])] na příslušné property, přičemž pokud je atribut se stejným názvem použit na více properties, vznikne index přes více sloupců (vlastností Order se řídí pořadí sloupců v definici indexu).

Ve FluentAPI lze takový efekt zapsat nepřímo, pomocí doplnění anotace:

this.Property(t =&gt; t.Identifier)
	.HasColumnAnnotation(
		IndexAnnotation.AnnotationName,
			new IndexAnnotation(
				new IndexAttribute("UIDX_MonitoredApplication_Identifier") { IsUnique = true }));

UPDATE: Pokud chceme index přes více sloupců, nebo jeden sloupec zahrnout do více indexů, může kód vypadat takto:

Property(loginAccount =&gt; loginAccount.Email)
    .HasColumnAnnotation(
        IndexAnnotation.AnnotationName,
        new IndexAnnotation(
            new IndexAttribute("UIDX_LoginAccount_Email_Deleted") { IsUnique = true, Order = 1 }));

Property(loginAccount =&gt; loginAccount.SingleSignOnIdentifier)
    .HasColumnAnnotation(
        IndexAnnotation.AnnotationName,
        new IndexAnnotation(
            new IndexAttribute("UIDX_LoginAccount_SingleSignOnIdentifier_Deleted") { IsUnique = true, Order = 1 }));

Property(loginAccount =&gt; loginAccount.Deleted)
    .HasColumnAnnotation(
        IndexAnnotation.AnnotationName,
        new IndexAnnotation(new[]
        {
            new IndexAttribute("UIDX_LoginAccount_Email_Deleted") { IsUnique = true, Order = 2 },
            new IndexAttribute("UIDX_LoginAccount_SingleSignOnIdentifier_Deleted") { IsUnique = true, Order = 2 }
        }));

Viz též EntityFramework specs – IndexAttribute.

1 thought on “Indexy (vč. unikátních) v Entity Frameworku (EF6.1)

  1. Robert Haken Post author

    Pro jistotu zdůrazňuji, že si vůbec nemyslím, že by atribut [Index] patřil na entitu do doménového modelu, proto uvádím ukázku jen pro FluentAPI používané v konfiguracích EF.
    V modelu podle mě mají být maximálně anotace, které nesouvisejí se způsobem jeho ukládání/prezentace, ale tvoří dejme tomu jeho contract.
    Atributy jako Required, StringLength, RegularExpression tedy ano.
    Atributy jako Index, Table, Column, Display, DataType, UIHint tedy ne.

    To se mi líbí

Napsat komentář k Robert Haken Zrušit odpověď na komentář

Vyplňte detaily níže nebo klikněte na ikonu pro přihlášení:

Logo WordPress.com

Komentujete pomocí vašeho WordPress.com účtu. Odhlásit /  Změnit )

Google photo

Komentujete pomocí vašeho Google účtu. Odhlásit /  Změnit )

Twitter picture

Komentujete pomocí vašeho Twitter účtu. Odhlásit /  Změnit )

Facebook photo

Komentujete pomocí vašeho Facebook účtu. Odhlásit /  Změnit )

Připojování k %s