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