2
  • 火鸟 2.5
  • 实体框架 5
  • 火鸟客户端DLL 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,但它似乎已从 Entity Framework 5 (或 4.1)中删除。

我希望你能理解我糟糕的英语,也许给我一个提示我做错了什么^^

4

2 回答 2

1

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

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

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

于 2012-11-16T12:34:09.580 回答
1

试试这个 ...

modelBuilder.Entity<INVOICES>()
      .HasRequired(i => i.CUSTOMERS)
      .WithMany()
      .HasForeignKey(i => i.CUSTOMERID);
于 2012-11-16T12:38:41.080 回答