Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Mappningsattribut används för att ändra eller åsidosätta konfigurationen som identifieras av modellbyggnadskonventioner. Konfigurationen som utförs av mappningsattributen kan åsidosättas av modellskapande-API:et som används i OnModelCreating.
Viktigt!
Det här dokumentet omfattar endast mappningsattribut i samband med relationskonfiguration. Andra användningsområden för mappningsattribut beskrivs i relevanta avsnitt i dokumentationen om bredare modellering.
Tips/Råd
Koden nedan finns i MappingAttributes.cs.
Var du kan hämta mappningsattribut
Många mappningsattribut kommer från System.ComponentModel.DataAnnotations och System.ComponentModel.DataAnnotations.Schema namespaces. Attributen i dessa namnområden ingår som en del av basramverket i alla versioner av .NET som stöds och kräver därför inte installation av ytterligare NuGet-paket. Dessa mappningsattribut kallas ofta för "dataanteckningar" och används av en mängd olika ramverk, inklusive EF Core, EF6, ASP.NET Core MVC och så vidare. De används också för validering.
Användningen av dataanteckningar i många tekniker och för både mappning och validering har lett till skillnader i semantik mellan olika tekniker. Alla nya mappningsattribut som är utformade för EF Core är nu specifika för EF Core, vilket gör att deras semantik och användning är enkel och tydlig. Dessa attribut finns i NuGet-paketet Microsoft.EntityFrameworkCore.Abstractions . Det här paketet ingår som ett beroende när huvudpaketet Microsoft.EntityFrameworkCore , eller något av de associerade databasproviderpaketen, används. Abstraktionspaketet är dock ett enkelt paket som kan refereras direkt av programkod utan att ta in alla EF Core och dess beroenden.
RequiredAttribute
RequiredAttribute tillämpas på en egenskap som anger att egenskapen inte kan vara null. I samband med relationer används [Required] vanligtvis på en utländsk nyckelegenskap. Detta gör att den främmande nyckeln inte kan vara null, vilket gör relationen obligatorisk. Med följande typer Post.BlogId görs egenskapen till exempel icke-nullbar och relationen blir obligatorisk.
public class Blog
{
public string Id { get; set; }
public List<Post> Posts { get; } = new();
}
public class Post
{
public int Id { get; set; }
[Required]
public string BlogId { get; set; }
public Blog Blog { get; init; }
}
Anmärkning
När du använder nullbara referenstyper i C#, är egenskapen i det här exemplet redan icke-nullbar, vilket innebär att BlogId-attributet inte har någon effekt.
[Required] placerat på den beroende navigeringen har samma effekt. Det innebär att sekundärnyckeln inte kan vara null och därmed göra relationen obligatorisk. Till exempel:
public class Blog
{
public string Id { get; set; }
public List<Post> Posts { get; } = new();
}
public class Post
{
public int Id { get; set; }
public string BlogId { get; set; }
[Required]
public Blog Blog { get; init; }
}
Om [Required] finns på den beroende navigationsegenskapen och egenskapen för den utländska nyckeln är i skuggtillstånd, görs skuggegenskapen inte-nullbar, vilket gör relationen obligatorisk. Till exempel:
public class Blog
{
public string Id { get; set; }
public List<Post> Posts { get; } = new();
}
public class Post
{
public int Id { get; set; }
[Required]
public Blog Blog { get; init; }
}
Anmärkning
Att använda [Required] på huvudnavigeringssidan för en relation har ingen effekt.
ForeignKeyAttribute
ForeignKeyAttribute används för att ansluta en utländsk nyckelegenskap med dess navigeringar.
[ForeignKey] kan placeras på egenskapen för en extern nyckel med den beroende navigeringens namn. Till exempel:
public class Blog
{
public string Id { get; set; }
public List<Post> Posts { get; } = new();
}
public class Post
{
public int Id { get; set; }
[ForeignKey(nameof(Blog))]
public string BlogKey { get; set; }
public Blog Blog { get; init; }
}
[ForeignKey] Eller så kan [ForeignKey] placeras antingen på den beroende eller den huvudnavigationen med namnet på egenskapen som ska användas som främmande nyckel. Till exempel:
public class Blog
{
public string Id { get; set; }
public List<Post> Posts { get; } = new();
}
public class Post
{
public int Id { get; set; }
public string BlogKey { get; set; }
[ForeignKey(nameof(BlogKey))]
public Blog Blog { get; init; }
}
När [ForeignKey] placeras i en navigering och det angivna namnet inte matchar något egenskapsnamn skapas en skuggegenskap med det namnet för att fungera som sekundärnyckel. Till exempel:
public class Blog
{
public string Id { get; set; }
public List<Post> Posts { get; } = new();
}
public class Post
{
public int Id { get; set; }
[ForeignKey("BlogKey")]
public Blog Blog { get; init; }
}
InverseProperty-attribut
InversePropertyAttribute används för att ansluta en navigering med dess omvända. I följande entitetstyper finns det till exempel två relationer mellan Blog och Post. Utan någon konfiguration kan EF-konventioner inte avgöra vilka navigeringar mellan de två typerna som ska kopplas. Om du lägger [InverseProperty] till någon av de länkade navigeringarna löser du den här tvetydigheten och gör det möjligt för EF att skapa modellen.
public class Blog
{
public int Id { get; set; }
[InverseProperty("Blog")]
public List<Post> Posts { get; } = new();
public int FeaturedPostId { get; set; }
public Post FeaturedPost { get; set; }
}
public class Post
{
public int Id { get; set; }
public int BlogId { get; set; }
public Blog Blog { get; init; }
}
Viktigt!
[InverseProperty] behövs bara när det finns fler än en relation mellan samma typer. Med en enda relation paras de två navigeringerna ihop automatiskt.
DeleteBehaviorAttribute
Genom konvention använder EF ClientSetNullDeleteBehavior för valfria relationer och Cascade-beteendet för nödvändiga relationer. Detta kan ändras genom att placera DeleteBehaviorAttribute på en av navigeringarna i relationen. Till exempel:
public class Blog
{
public int Id { get; set; }
public List<Post> Posts { get; } = new();
}
public class Post
{
public int Id { get; set; }
public int BlogId { get; set; }
[DeleteBehavior(DeleteBehavior.Restrict)]
public Blog Blog { get; init; }
}
Mer information om sammanhängande beteenden finns i Kaskadborttagning .