我开始学习EF Fluent API。
我有两个简单的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中的主键,projd将是项目表中的主键。
我对这种行为有点惊讶。项目表中的CustomerId自动为外键。此行为基于命名约定?或者它是如何工作的?
是的,它是基于命名约定的,在这种情况下,特别是NavigationPropertyNameForeignKeyDiscoveryConvention
:
约定发现名称为a的外键属性依赖的导航属性名(在您的例子中是Customer)和principal type主键属性名(CustomerId)。
或者是PrimaryKeyNameForeignKeyDiscoveryConvention
:
约定发现名称与主体类型主键属性名。
我不确定是哪一个。
如果你不喜欢这些约定之一,你可以用模型生成器删除它们:
modelBuilder.Conventions
.Remove<NavigationPropertyNameForeignKeyDiscoveryConvention>();
// etc.