为什么EF不在SQL表中创建第二个外键列?

时间:2013-11-12 11:09:49

标签: c# asp.net sql entity-framework

我正在尝试创建一个与其他两个实体(域,子页面)相关的实体(链接),因此链接表将具有两列ID和SubpageID。基本上我正在尝试创建2个一对多关系,其中Domain对象和Subpage对象可以映射到许多Link对象,每个Link对象只与一个Domain和Subpage对象相关。

链接模型

 public class Link
    {
        [Key]
        public int LinkID { get; set; }

        ...

        [Required]
        public int ID { get; set; }
        public virtual Domain Domain { get; set; }
        [Required]
        public int SubpageID { get; set; }
        public virtual Subpage Subpage { get; set; }
    }

域名模型

public class Domain
    {
        public int ID { get; set; }

        ...

        ICollection<Link> Links { get; set; }
    }

子页面模型

 public class Subpage
    {
        [Key]
        public int SubpageID { get; set; }

        ...

        [Required]
        public int ID { get; set; }
        public virtual Domain Domain { get; set; }

        ICollection<Link> Links { get; set; }

    }

的DbContext

public class DomainAppContext : DbContext
    {
        public DbSet<Domain> Domains { get; set; }
        public DbSet<RegInfo> RegInfos { get; set; }
        public DbSet<Subpage> Subpages { get; set; }
        public DbSet<Link> Links { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
        }

    }

解决Cascade Delete等问题后,我注意到Link Table没有SubpageID列,我不明白为什么......

如何强制EF在链接表上创建SubpageID列?

1 个答案:

答案 0 :(得分:1)

您好我已经尝试使用EF 4.3和6.01以及创建的字段没有问题。您可以尝试执行以下操作。 首先,您应该将两个ICollection Links声明为public。在 OnModelCreating 内,您应该添加以下代码

modelBuilder.Entity<Link>()
            .HasRequired(p => p.Subpage)
            .WithMany(l => l.Links)
            .HasForeignKey(k => k.SubpageID);

modelBuilder.Entity<Link>()
            .HasRequired(p => p.Domain)
            .WithMany(l => l.Links)
            .HasForeignKey(k => k.ID);

这会强迫你的关系