实体框架代码优先 - 复合主键上的导航属性

时间:2012-11-16 12:11:30

标签: entity-framework ef-code-first entity-framework-5 firebird2.5

  • Firebird 2.5
  • 实体框架5
  • FirebirdClientDll 3.0.0.0

您好,我尝试使用实体框架(代码优先)访问我的旧数据库。 我遇到了数据库不使用外键的问题......

public class CUSTOMERS
{
    public int CUSTOMERID { get; set; }
    public string NAME{ get; set; }
}

public class INVOICES
{
    public int INVOICEID{ get; set; }
    public int CUSTOMERID{ get; set; }

    public virtual CUSTOMERS CUSTOMERS { get; set; }
}

public class INVOICEContext : DbContext
{
    public DbSet<CUSTOMERS> CUSTOMERS{ get; set; }
    public DbSet<INVOICES> INVOICES{ get; set; }

    public INVOICEContext(DbConnection connectionString) : base(connectionString, false)
    {
        Database.SetInitializer<INVOICEContext>(null);
    }

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

        /*modelBuilder.Entity<INVOICES>().HasRequired(b => b.CUSTOMERS)
                    .WithMany()
                    .Map(p => p.MapKey("INVOICEID"));*/ //Doesn't work because INVOICEID is defined

        modelBuilder.Entity<INVOICES>().HasKey(a => new { a.INVOICEID, a.CUSTOMERID});
        modelBuilder.Entity<CUSTOMERS>().HasKey(a => new { a.CUSTOMERID });

        base.OnModelCreating(modelBuilder);
    }
}

通常情况下,我可以从类CUSTOMERID中删除属性INVOICES,但在这种情况下,它是主键的一部分......

我发现许多帖子建议使用IsIndependent,但似乎是removed from the Entity Framework 5 (or 4.1)

我希望你能理解我可怜的英语,也许可以暗示我做错了什么^^

2 个答案:

答案 0 :(得分:1)

我不知道“数据库不使用外键”是什么意思。所以,也许以下不是您正在寻找的答案。但是,如果您将...MapKey...替换为HasForeignKey并使用CUSTOMERID代替INVOICEID作为外国人,我可以说您可以使用代码中已注释掉的关系映射关键属性:

modelBuilder.Entity<INVOICES>()
    .HasRequired(b => b.CUSTOMERS)
    .WithMany()
    .HasForeignKey(b => b.CUSTOMERID);

在我看来,模型和映射的其余部分都很好。您的关系是标识关系(这意味着外键是复合主键的一部分),它是与实体框架的有效映射。

答案 1 :(得分:1)

试试这个......

modelBuilder.Entity<INVOICES>()
      .HasRequired(i => i.CUSTOMERS)
      .WithMany()
      .HasForeignKey(i => i.CUSTOMERID);