EF 4.1 代码优先映射问题

发布于 2024-11-03 19:09:57 字数 1517 浏览 0 评论 0原文

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

    }
}

All my attempts to map the ID of SitePage to the database column ID (SitePages table, ID column of type bigint) has failed. It keeps looking for column SitePage_ID to map it.. Can you see where I am doing wrong? All related code is below;

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

    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

猫九 2024-11-10 19:09:57

你没有做错任何事。您显示的代码可以正确执行所有操作。您甚至不需要在 SitePage 中显式定义 ID 的名称,因为无论如何它都会像 ID 一样定义。

默认情况下,为独立关联创建的外键使用 SitePage_ID 命名约定。那么 SitePage 和任何其他实体之间是否还有其他一对多关系?如果您没有在依赖实体中映射外键,则默认情况下它将定义为 SitePage_ID

You are not doing anything wrong. The code you shown does everything correctly. You even don't need to explicitly define the name of ID in SitePage because it will be defined like ID anyway.

SitePage_ID is used by default naming convention for foreign keys created for independent associations. So do you have any other one-to-many relation between SitePage and any other entity? If you didn't map foreign key in dependent entity it will be defined as SitePage_ID by default.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文