实体框架流畅API -基于命名约定创建外键



我开始学习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.

最新更新