代码优先于一对多关系的多个外键

时间:2013-11-10 01:37:35

标签: entity-framework ado.net ef-code-first

我遇到了一些使用Entity Framework 6,Code First Fluent API远离惯例的问题。

一个典型的例子是我有一个名为Software的实体。我不希望db表被称为软件。它应该被称为软件。但也有其他一些偏离。

问题是,正在为外键创建2列,其中只有1列。例如,在我的域中,SoftwareFiles和Software之间的关系是1:m。 (逻辑是,由于服务包,可能有超过1个文件与一个软件相关,例如Windows XP将有超过1个与之关联的ISO)。

文件:

public class Software
{
    public string Description { get; set; }
    public int Id { get; set; }
    public SoftwareType Type { get; set; }
    public int TypeId { get; set; }

    public virtual ICollection<SoftwareFile> SoftwareFiles { get; set; }
}

public class SoftwareFile
{
    public int Id { get; set; }
    public string FileName { get; set; }
    public FileTypes FileType { get; set; }
    public string Name { get; set; }
    public Software Software { get; set; }
    public int SoftwareId { get; set; }
}

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //  Set up the SoftwareFile table
        modelBuilder.Entity<SoftwareFile>().Property(s => s.FileName).HasMaxLength(250).IsRequired().IsVariableLength();
        modelBuilder.Entity<SoftwareFile>().Property(s => s.FileType).IsRequired();
        modelBuilder.Entity<SoftwareFile>().HasRequired(s => s.Software).WithMany().HasForeignKey(s => s.SoftwareId);

        modelBuilder.Entity<Software>().ToTable("Software");
        modelBuilder.Entity<Software>().Property(s => s.Description).HasMaxLength(250).IsOptional().IsVariableLength();
        modelBuilder.Entity<Software>().HasRequired(s => s.Type).WithMany().HasForeignKey(t => t.TypeId);


        base.OnModelCreating(modelBuilder);
    }

即在sdf数据库中创建 SoftwareId 列和 Software_Id 列。

有谁知道如何以这种方式脱离惯例?

干杯

1 个答案:

答案 0 :(得分:1)

双重外键与表的重命名无关。

删除

 modelBuilder.Entity<SoftwareFile>().HasRequired(s => s.Software).WithMany().HasForeignKey(s => s.SoftwareId);

线。

这行代码表示SoftwareSoftwareFile之间存在单面一对多关系,应该使用SoftwareId属性作为外键

但是你SoftwareFiles上有一个Software属性,这使得EF假设您想要定义第二个双面,您选择不提供显式外键的两个实体之间的一对多关系。

因此EF通过创建名为Software_Id

的第二个外键属性来解决问题