3

我試圖將SitePage的ID映射到數據庫列ID(SitePages表,大寫字母的ID列)失敗。它不斷尋找專欄SitePage_ID來映射它..你能看到我在做什麼錯了嗎?所有相關的代碼如下所示;EF 4.1代碼優先映射問題

public class Site : EntityBase<Int64> 
{ 
    public virtual string Url { get; set; } 
    public virtual IList<SitePage> Pages { get; set; } 
} 

public class SitePage : EntityBase<Int64> 
{ 
    public virtual Site Site { get; set; } 

    public virtual string Url { get; set; } 
    public virtual string Html { get; set; } 
    public virtual string Text { get; set; } 
    public virtual string Language { get; set; } 
} 

public abstract class EntityBase<T> : IComparable 
{ 

    public virtual T ID { get; set; } 

    protected EntityBase() : this(default(T)) 
    { 
    } 

    protected EntityBase(T id) 
    { 
     this.ID = id; 

     if (this.ID == null) 
      this.ID = default(T); 
    } 
} 

public class SpellCrawlerContext : DbContext 
{ 
    public SpellCrawlerContext(){} 

    public DbSet<Site> Sites { get; set; } 

    public DbSet<SitePage> SitePages { get; set; } 


    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Site>() 
      .HasMany(s => s.Pages) 
      .WithRequired(p => p.Site) 
      .Map(s => s.MapKey("SiteID")); 

     modelBuilder.Entity<SitePage>() 
      .HasKey(p => p.ID); 

     modelBuilder.Entity<SitePage>() 
      .Property(p => p.ID) 
      .HasColumnName("ID"); 

    } 
} 
+0

你能澄清你期望的表格佈局嗎?您在SitePages表上生成Site_ID列的代碼,但在任一表上沒有SitePage_ID列。 – Josh 2011-04-29 19:47:56

+0

我使用了您提供的代碼並讓EF生成數據庫模式。它正確地生成了模式,我沒有錯誤。在提供的示例代碼中是否有任何缺失? – 2011-04-29 20:14:11

+0

我沒有EF生成表..我正在連接到現有的數據庫。基本上每個表都有ID列作爲主鍵/標識列。 EntitiyBase上的ID直接映射到每個表的ID列。 EF由於某種原因期望一個SitePage_ID列事件,儘管我明確告訴它將SitePage類的ID屬性映射到OnModelCreating上的ID列。我想我做錯了,但我不知道在哪裏 – kaivalya 2011-04-29 22:07:38

回答

1

你沒有做錯任何事。您顯示的代碼正確地執行了一切。你甚至不需要在SitePage中明確定義ID的名字,因爲它將被定義爲如ID

SitePage_ID默認使用爲獨立關聯創建的外鍵的命名約定。那麼你在SitePage和任何其他實體之間還有其他一對多的關係嗎?如果您未將外鍵映射到從屬實體,則默認將其定義爲SitePage_ID

+0

謝謝拉迪斯拉夫,我有公共虛擬IList ChildPages {get;組; } SitePage這是原因.. – kaivalya 2011-04-30 20:35:00