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. avatar Robert HakenRobert 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ář