2015-10-22 52 views
0

我試圖做一個自我引用表重新命名外鍵列在流暢API

public class Category 
{ 
    // PK 
    public int CategoryId { get; set; } 

    // Property 
    public string CategoryName { get; set; } 

    // FK 
    public int? ParentCategoryId { get; set; } 

    public virtual ICollection<Category> ParentCategories { get; set; } 
    public virtual ICollection<Product> Products { get; set; } // Product is defined later 
} 

和配置不工作:

public class CategoryConfiguration : EntityTypeConfiguration<Category> 
{ 
    public CategoryConfiguration():base() 
    { 
     HasKey(c => new { c.CategoryId }); 

     HasOptional(c => c.ParentCategories) 
      .WithMany() 
      .HasForeignKey(c => c.ParentCategoryId); 
    } 
} 

的想法是使用ParentCategoryId作爲列名,但它不起作用。相反,它生成一個名爲:Category_CategoryId的列。

我曾嘗試使用.Map(c => c.MapKey("ParentCategoryId")),結果是一樣的。

我不認爲這是自參照的原因,因爲同樣的事情在許多一對多的關係發生了:

public class Product 
{ 
    public int ProductId { get; set; } 
    public string ProductName { get; set; } 

    public virtual ICollection<Category> Categories { get; set; } 
} 

Product配置

public class ProductConfiguration:EntityTypeConfiguration<Product> 
{ 
    public ProductConfiguration():base() 
    { 
     // Many-to-Many 
     HasMany(c => c.Categories) 
      .WithMany() 
      .Map(p => 
      { 
       p.MapLeftKey("ProductRefId"); 
       p.MapRightKey("CategoryRefId"); 
       p.ToTable("ProductCategory"); 
      }); 
    } 
} 

表名字是ProductCategories而不是ProductCategory 外鍵是Product_ProductIdCategory_CategoryId 他們都沒有什麼期待。

我怎樣才能解決這個問題?請幫忙。

謝謝!


更新1

奇怪的是,如果我通過DbModelBuilder定義它,然後它

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Category>() 
      .HasOptional(c => c.ParentCategories) 
      .WithMany() 
      .HasForeignKey(c => c.ParentCategoryId); 
    } 

外鍵成爲ParentCategoryId預期。

+0

首先,不要調用空base(),它會在你的類中運行ctor之前被調用。其次,刪除這個HasKey(c => new {c.CategoryId});並只寫HasKey(c => c.CategoryId); 關於你的問題,db中列的名稱是什麼? – ivamax9

+0

嗨,@Chase。謝謝你的建議。外鍵列名是'Category_CategoryId',我想使用'ParentCategoryId'作爲它的名字。 – Hao

回答

0

問題解決了,我犯了一個錯誤。我沒有將配置掛接到DbContext中。

通過添加這些到DbContext,如預期的列被重命名。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
     modelBuilder.Configurations.Add(new CategoryConfiguration()); 
     modelBuilder.Configurations.Add(new ProductConfiguration()); 
    }