Подтвердить что ты не робот

Правила создания свойств платформы Entity Framework

Я хотел бы знать, какие правила Entity Framework следует в отношении свойств именования/генерации навигационных свойств. Я наблюдал несколько сценариев, которые, похоже, не имеют смысла, поэтому мне было интересно, знает ли кто-нибудь, как они работают.

Сценарий 1:

public class Post
{
    public int Id { get; set; }
    public User Author { get; set; }
} 

    Формирует

Scenario 1

т. по умолчанию свойства навигации генерируют FK с именем [PropertyName] _Id

Сценарий 2:

Имеет смысл, что если EF генерирует такие свойства формата [PropertyName] _Id, когда вы вручную укажете FK Id, он будет следовать тем же правилам:

public class Post
{
    public int Id { get; set; }
    public int? Author_Id { get; set; }
    public User Author { get; set; }
}

    Формирует

Scenario 2

Как вы можете видеть, это автоматически не регистрируется как свойство nav.

Сценарий 3:

Если это не работает для сценария 2, почему он работает для альтернативного соглашения об именах?

public class Post
{
    public int Id { get; set; }
    public int? AuthorId { get; set; }
    public User Author { get; set; }
}

    Формирует

Scenario 3

Каковы правила обнаружения и генерации навигационных свойств?

4b9b3361

Ответ 1

Это ожидаемое поведение и основано на двух разных соглашениях, основанных на EF

  • В первом примере вы используете независимую ассоциацию, в которой ваша сущность не имеет свойства FK. EF создаст FK в базе данных, используя простой шаблон: NameOfNavigationProperty_NameOfRelatedPK Это соглашение следует традиционному именованию базы данных.
  • Во втором примере вы определили свойство с тем же именем, что и FK, используемое EF. EF обнаружил это и добавил 1 к его сгенерированному FK. Причина, по которой ваше свойство не используется как FK, является вторым соглашением, которое ищет свойства FK. В этом соглашении предполагается, что это свойство будет иметь свойство FK (соглашения следуют традиционному наименованию .NET):
    • NameOfNavigationPropertyNameOfRelatedPK предоставляется NavigationPropertyNameForeignKeyDiscoveryConvention
    • NameOfRelatedTypeNameOfItsPK предоставляется TypeNameForeignKeyDiscoveryConvention
    • NameOfRelatedPK предоставляется PrimaryKeyNameForeignKeyDiscoveryConvention
  • В последнем примере вы правильно определили свойство FK и EF обнаружили его так, что он использует ассоциацию внешних ключей.