Правила создания свойств платформы 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]()
Каковы правила обнаружения и генерации навигационных свойств?
Ответы
Ответ 1
Это ожидаемое поведение и основано на двух разных соглашениях, основанных на EF
- В первом примере вы используете независимую ассоциацию, в которой ваша сущность не имеет свойства FK. EF создаст FK в базе данных, используя простой шаблон:
NameOfNavigationProperty_NameOfRelatedPK
Это соглашение следует традиционному именованию базы данных.
- Во втором примере вы определили свойство с тем же именем, что и FK, используемое EF. EF обнаружил это и добавил 1 к его сгенерированному FK. Причина, по которой ваше свойство не используется как FK, является вторым соглашением, которое ищет свойства FK. В этом соглашении предполагается, что это свойство будет иметь свойство FK (соглашения следуют традиционному наименованию .NET):
-
NameOfNavigationPropertyNameOfRelatedPK
предоставляется NavigationPropertyNameForeignKeyDiscoveryConvention
-
NameOfRelatedTypeNameOfItsPK
предоставляется TypeNameForeignKeyDiscoveryConvention
-
NameOfRelatedPK
предоставляется PrimaryKeyNameForeignKeyDiscoveryConvention
- В последнем примере вы правильно определили свойство FK и EF обнаружили его так, что он использует ассоциацию внешних ключей.
Ответ 2
В дополнение к ответу @Ladislav Mrnka выше вы можете найти подробную ссылку на условные условные обозначения сущности:
http://msdn.microsoft.com/en-us/library/system.data.entity.modelconfiguration.conventions(v=vs.103).aspx