entity framework fluent api — создание ключа forgein на основе соглашения об именовании

#entity-framework-4.1 #entity-relationship #foreign-key-relationship

#entity-framework-4.1 #сущность-отношение #foreign-key-relationship

Вопрос:

Я начинаю изучать EF Fluent API.

У меня есть 2 простых класса POCO.

 public class Customer
{
    public int CustomerId{ get; set;}
    public string Name{ get; set;}
}

public class Project
{
    public int ProjectId { get; set; }
    public int CustomerId { get; set; }
    public string Name { get; set; }
    public Customer Customer { get; set; }
}
 

контекстный класс

    public class MyCtx:DbContext
    {
        public DbSet<Project> Projects { get; set; }
        public DbSet<Customer> Authors { get; set; }

        public MyCtx(string  connString):base(connString)
        {}

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //PK
            modelBuilder.Entity<Project>()
                .HasKey(p => p.ProjectId)
                .Property(p => p.ProjectId)
                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
                .HasColumnName("PROJECT_ID")
                .IsRequired();


            modelBuilder.Entity<Project>()
                .Property(c => c.Name)
                .HasColumnName("NAME")
                .IsRequired();

            //--------------------------------------------------------------------

            //PK
            modelBuilder.Entity<Customer>()
                .HasKey(c => c.CustomerId)
                .Property(c => c.CustomerId)
                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
                .HasColumnName("CUSTOMER_ID")
                .IsRequired();

            modelBuilder.Entity<Customer>()
                .Property(c => c.Name)
                .HasColumnName("NAME")
                .IsRequired();

            base.OnModelCreating(modelBuilder);
        }
    }
 

Я определил, что CustomerID будет первичным ключом в таблице customer, а ProjectID будет первичным ключом в таблице project.

Я немного удивлен таким поведением. CustomerID в таблице проекта автоматически является внешним ключом.

Это поведение основано на соглашении об именовании? Или как это работает?

Ответ №1:

Да, он основан на соглашении об именовании, в данном случае конкретно на NavigationPropertyNameForeignKeyDiscoveryConvention :

Соглашение об обнаружении свойств внешнего ключа, имена которых представляют собой комбинацию имени зависимого свойства навигации (Customer в вашем случае) и имени (имен) свойств первичного ключа основного типа (CustomerID в вашем случае).

Или это PrimaryKeyNameForeignKeyDiscoveryConvention :

Соглашение об обнаружении свойств внешнего ключа, имена которых соответствуют именам свойств первичного ключа основного типа.

Я не уверен, какой именно.

Если вам не нравится одно из этих соглашений, вы можете удалить их с помощью конструктора моделей:

 modelBuilder.Conventions
    .Remove<NavigationPropertyNameForeignKeyDiscoveryConvention>();
// etc.
 

Полный список всех соглашений находится здесь.