Entity Framework Fluent API - создать поддельный ключ на основе соглашения об именах - PullRequest
0 голосов
/ 28 октября 2011

Я начинаю изучать 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 будет первичным ключомв таблице проекта.

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

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

1 Ответ

0 голосов
/ 28 октября 2011

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

Конвенция об обнаружении свойств внешнего ключа, чьи имена сочетание имени зависимого свойства навигации ( Customer в вашем случае) и имя (имена) свойств первичного ключа основного типа ( CustomerId в вашем случае).

Или это PrimaryKeyNameForeignKeyDiscoveryConvention:

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

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

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

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

Полный список всех конвенций здесь .

...