EF 4.1 Code First 映射问题

3

我尝试将SitePage的ID映射到数据库列ID(SitePages表,类型为bigint的ID列),但都失败了。它一直在寻找SitePage_ID列来进行映射。您能看出我哪里做错了吗?以下是所有相关的代码:

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");

    }
}

你能澄清一下你期望的表格布局吗?你所拥有的代码在SitePages表上生成了一个Site_ID列,但是在任何一个表格上都没有SitePage_ID列。 - Josh
我使用了你提供的代码,让EF生成数据库架构。它成功地生成了架构,没有出现任何错误。在提供的示例代码中可能还有遗漏吗? - John Allers
我没有让EF生成表,而是连接到现有的数据库。基本上每个表都有一个ID列作为主键/标识列。EntitiyBase上的ID直接映射到每个表的ID列。尽管我在OnModelCreating中明确告诉它将SitePage类的ID属性映射到ID列,但EF出于某种原因仍然期望SitePage_ID列。我想我做错了什么,但我不知道错在哪里。 - kaivalya
1个回答

1

你没有做错任何事情。你展示的代码已经完全正确了。你甚至不需要显式地定义IDSitePage中的名称,因为它会像ID一样被定义。

SitePage_ID是独立关联创建的外键的默认命名约定。所以你是否在SitePage和其他实体之间有其他的一对多关系?如果你没有在从属实体中映射外键,它将默认定义为SitePage_ID


谢谢Ladislav,我在SitePage上有public virtual IList<SitePage> ChildPages { get; set; },这就是原因。 - kaivalya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接