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 => 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 => loginAccount.Email) .HasColumnAnnotation( IndexAnnotation.AnnotationName, new IndexAnnotation( new IndexAttribute("UIDX_LoginAccount_Email_Deleted") { IsUnique = true, Order = 1 })); Property(loginAccount => loginAccount.SingleSignOnIdentifier) .HasColumnAnnotation( IndexAnnotation.AnnotationName, new IndexAnnotation( new IndexAttribute("UIDX_LoginAccount_SingleSignOnIdentifier_Deleted") { IsUnique = true, Order = 1 })); Property(loginAccount => 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 } }));
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íTo se mi líbí