实体框架流畅的api - 根据命名约定创建外键

时间:2011-10-28 16:22:06

标签: entity-framework-4.1 entity-relationship 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将成为项目表中的主键。

我对这种行为感到有些惊讶。项目表中的CustomerId是自动外键。

此行为是基于命名约定的?或者它是如何工作的?

1 个答案:

答案 0 :(得分:0)

是的,它基于命名约定,在这种情况下特别是NavigationPropertyNameForeignKeyDiscoveryConvention

  

发现名称为a的外键属性的约定   依赖导航属性名称(在您的情况下为客户)和   主要类型主键属性名称(在您的情况下为 CustomerId )。

或者是PrimaryKeyNameForeignKeyDiscoveryConvention

  

发现名称与之匹配的外键属性的约定   主要类型主键属性名称。

我不确定是哪一个。

如果您不喜欢其中一个约定,可以使用模型构建器删除它们:

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

所有公约的完整列表为here