Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Атрибуты сопоставления используются для изменения или переопределения конфигурации, обнаруженной соглашениями о сборке моделей. Конфигурация, заданная атрибутами сопоставления, может быть переопределена используемым API сборке модели в OnModelCreating.
Внимание
В этом документе рассматриваются только атрибуты сопоставления в контексте конфигурации отношений. Другие варианты использования атрибутов сопоставления рассматриваются в соответствующих разделах более широкой документации по моделированию.
Совет
Приведенный ниже код можно найти в MappingAttributes.cs.
Где получить атрибуты сопоставления
Многие атрибуты сопоставления приходят из пространств имен System.ComponentModel.DataAnnotations и System.ComponentModel.DataAnnotations.Schema . Атрибуты в этих пространствах имен включены в состав базовой платформы во всех поддерживаемых версиях .NET, поэтому не требуют установки дополнительных пакетов NuGet. Эти атрибуты сопоставления обычно называются "заметками данных" и используются различными платформами, включая EF Core, EF6, ASP.NET Core MVC и т. д. Они также используются для проверки.
Использование заметок данных во многих технологиях и для сопоставления и проверки привело к различиям в семантике между технологиями. Все новые атрибуты сопоставления, предназначенные для EF Core, теперь относятся исключительно к EF Core, что позволяет сохранить их семантику и использование простыми и понятными. Эти атрибуты содержатся в пакете NuGet Microsoft.EntityFrameworkCore.Abstractions . Этот пакет включается в качестве зависимости всякий раз, когда используется основной пакет Microsoft.EntityFrameworkCore или один из связанных пакетов поставщика баз данных. Однако пакет Абстракции — это легковесный пакет, на который можно ссылаться напрямую из кода приложения, не включая весь EF Core и его зависимости.
НеобходимыйАтрибут
RequiredAttribute применяется к свойству, чтобы указать, что свойство не может быть null. В контексте связей [Required] обычно используется для свойства внешнего ключа. Это делает внешний ключ непринимающим значение NULL, тем самым делая связь обязательной. Например, со следующими типами Post.BlogId свойство становится ненулевым, и связь становится обязательной.
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; }
}
Примечание.
При использовании ссылочных типов, допускающих значение NULL на C#, BlogId свойство в этом примере уже не допускает значения NULL, что означает, что [Required] атрибут не будет иметь эффекта.
[Required] элементы, размещенные на зависимой навигации, оказывают тот же эффект. То есть, делая внешний ключ не допускающим значение NULL, и тем самым делая связь обязательной. Например:
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; }
}
Если [Required] найден в зависимой навигации и свойство внешнего ключа находится в теневом состоянии, то теневое свойство становится ненулевым, тем самым делая связь обязательной. Например:
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; }
}
Примечание.
Использование [Required] на основной стороне навигации в отношениях не оказывает никакого эффекта.
ForeignKeyAttribute
ForeignKeyAttribute используется для подключения свойства внешнего ключа с навигацией.
[ForeignKey] может быть помещен в свойство внешнего ключа с именем зависимой навигации. Например:
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] можно поместить в зависимый или основной элемент навигации с именем свойства, которое будет использоваться в качестве внешнего ключа. Например:
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; }
}
Когда [ForeignKey] помещается на навигацию и указанное имя не соответствует ни одному имени свойства, то теневое свойство с этим именем будет создано, чтобы действовать в качестве внешнего ключа. Например:
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 используется для подключения навигации с её обратной связью. Например, в следующих типах сущностей существует две связи между Blog и Post. Без какой-либо конфигурации соглашения EF не в состоянии определить, какие навигации между двумя типами следует связать. Добавление [InverseProperty] к одной из связанных навигаций устраняет эту неопределенность и позволяет EF построить модель.
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; }
}
Внимание
[InverseProperty] требуется только в том случае, если между теми же типами существует несколько связей. С одной связью две навигации объединяются автоматически.
DeleteBehaviorAttribute
По соглашению, EF использует ClientSetNullDeleteBehavior для необязательных связей и Cascade для поведения обязательных связей. Это можно изменить, поместив DeleteBehaviorAttribute на одну из навигаций связи. Например:
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; }
}
Дополнительные сведения об каскадном удалении см. в статье об каскадном поведении .