#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.
Полный список всех соглашений находится здесь.