Teilen über


Zuordnungsattribute (auch als Datenanmerkungen bekannt) für Beziehungen

Zuordnungsattribute werden verwendet, um die von Modellerstellungskonventionen ermittelte Konfiguration zu ändern oder außer Kraft zu setzen. Die durch Zuordnungsattribute vorgenommene Konfiguration kann selbst durch die in OnModelCreating verwendete API zur Modellerstellung außer Kraft gesetzt werden.

Wichtig

Dieses Dokument behandelt nur Zuordnungsattribute im Kontext der Beziehungskonfiguration. Andere Verwendungen von Zuordnungsattributen werden in den relevanten Abschnitten der umfassenderen Dokumentation zur Modellierung behandelt.

Tipp

Der folgende Code befindet sich in MappingAttributes.cs.

Position zum Abrufen von Zuordnungsattributen

Viele Zuordnungsattribute stammen aus den Namespaces System.ComponentModel.DataAnnotations und System.ComponentModel.DataAnnotations.Schema. Die Attribute in diesen Namespaces sind als Teil des Basisframeworks in allen unterstützten Versionen von .NET enthalten und erfordern daher keine Installation zusätzlicher NuGet-Pakete. Diese Zuordnungsattribute werden gemeinhin als „Datenanmerkungen“ bezeichnet und von einer Vielzahl von Frameworks verwendet, darunter EF Core, EF6, ASP.NET Core MVC usw. Sie werden auch zur Überprüfung verwendet.

Die Verwendung von Datenanmerkungen für verschiedene Technologien und sowohl für die Zuordnung als auch für die Überprüfung hat zu Unterschieden in der Semantik der verschiedenen Technologien geführt. Alle neuen Zuordnungsattribute, die für EF Core entwickelt wurden, sind jetzt spezifisch für EF Core, wodurch ihre Semantik und Verwendung einfach und klar bleibt. Diese Attribute sind im NuGet-Paket Microsoft.EntityFrameworkCore.Abstractions enthalten. Dieses Paket ist immer dann als Abhängigkeit enthalten, wenn das Hauptpaket Microsoft.EntityFrameworkCore oder eines der zugehörigen Datenbankanbieterpakete verwendet wird. Das Abstraktionspaket ist jedoch ein einfaches Paket, auf das direkt vom Anwendungscode verwiesen werden kann, ohne das gesamte EF Core und seine Abhängigkeiten einzubinden.

RequiredAttribute

RequiredAttribute wird auf eine Eigenschaft angewendet, um anzugeben, dass die Eigenschaft nicht null sein kann. Im Kontext von Beziehungen wird [Required] normalerweise für eine Fremdschlüsseleigenschaft verwendet. Dadurch lässt der Fremdschlüssel keine Nullwerte zu, wodurch die Beziehung erforderlich wird. Bei den folgenden Typen wird z. B. für die Eigenschaft Post.BlogId dafür gesorgt, dass sie „Non-Nullable“ ist und die Beziehung wird erforderlich.

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; }
}

Hinweis

Wenn Sie Nullwerte zulassende Verweistypen von C# verwenden, ist die BlogId-Eigenschaft in diesem Beispiel bereits „Non-Nullable“, was bedeutet, dass das [Required]-Attribut keine Auswirkungen hat.

[Required] in der abhängigen Navigation hat denselben Effekt. Das bedeutet, Sie machen den Fremdschlüssel „Non-Nullable“, wodurch die Beziehung erforderlich wird. Beispiel:

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; }
}

Wenn [Required] in der abhängigen Navigation gefunden wird und die Fremdschlüsseleigenschaft sich im Schattenzustand befindet, wird die Schatteneigenschaft „Non-Nullable“ gemacht, wodurch die Beziehung erforderlich wird. Beispiel:

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; }
}

Hinweis

Die Verwendung von [Required] auf der Prinzipalnavigationsseite einer Beziehung hat keine Auswirkung.

ForeignKeyAttribute

ForeignKeyAttribute wird verwendet, um eine Fremdschlüsseleigenschaft mit ihren Navigationen zu verbinden. [ForeignKey] kann für die Fremdschlüsseleigenschaft mit dem Namen der abhängigen Navigation platziert werden. Beispiel:

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; }
}

Oder [ForeignKey] kann entweder auf der abhängigen oder der Prinzipalnavigation mit dem Namen der Eigenschaft platziert werden, die als Fremdschlüssel verwendet werden soll. Beispiel:

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; }
}

Wenn [ForeignKey] in einer Navigation platziert wird und der angegebene Name keinem Eigenschaftennamen entspricht, wird eine Schatteneigenschaft mit diesem Namen erstellt, um als Fremdschlüssel zu fungieren. Beispiel:

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; }
}

InversePropertyAttribute

InversePropertyAttribute wird verwendet, um eine Navigation mit ihrer Umkehrung zu verbinden. Bei den folgenden Entitätstypen gibt es z. B. zwei Beziehungen zwischen Blog und Post. Ohne jegliche Konfiguration können die EF-Konventionen nicht bestimmen, welche Navigationen zwischen den beiden Typen gekoppelt werden sollen. Das Hinzufügen von [InverseProperty] zu einer der gekoppelten Navigationen löst diese Mehrdeutigkeit auf und ermöglicht es EF, das Modell zu erstellen.

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; }
}

Wichtig

[InverseProperty] ist nur erforderlich, wenn es mehr als eine Beziehung zwischen denselben Typen gibt. Bei einer einzelnen Beziehung werden die beiden Navigationen automatisch gekoppelt.

DeleteBehaviorAttribute

Per Konvention verwendet EF ClientSetNullDeleteBehavior für optionale Beziehungen und das Cascade-Verhalten für erforderliche Beziehungen. Dies können Sie ändern, indem Sie DeleteBehaviorAttribute bei einer der Navigationen der Beziehung platzieren. Beispiel:

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; }
}

Weitere Informationen zu kaskadierenden Verhaltensweisen finden Sie unter Kaskadierendes Delete.