我开始学习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是自动外键。
此行为是基于命名约定的?或者它是如何工作的?
答案 0 :(得分:0)
是的,它基于命名约定,在这种情况下特别是NavigationPropertyNameForeignKeyDiscoveryConvention
:
发现名称为a的外键属性的约定 依赖导航属性名称(在您的情况下为客户)和 主要类型主键属性名称(在您的情况下为 CustomerId )。
或者是PrimaryKeyNameForeignKeyDiscoveryConvention
:
发现名称与之匹配的外键属性的约定 主要类型主键属性名称。
我不确定是哪一个。
如果您不喜欢其中一个约定,可以使用模型构建器删除它们:
modelBuilder.Conventions
.Remove<NavigationPropertyNameForeignKeyDiscoveryConvention>();
// etc.
所有公约的完整列表为here。