【问题标题】:Entity Framework Code First - Navigation property on Composite Primaty Key实体框架代码优先 - 复合主键上的导航属性
【发布时间】:2012-11-16 12:11:29
【问题描述】:
  • 火鸟 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);
    }
}

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

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

希望你能看懂我蹩脚的英语,或许能给我提示一下我做错了什么^^

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗯,我试过了,但属性 CUSTOMERS 始终为空。 “不使用外键”是指数据库中没有定义外键(遗留)。
    • 天啊,我用错了数据库。现在可以了。非常感谢!
    【解决方案2】:

    试试这个...

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

    【讨论】:

    • 同上,CUSTOMERS 属性始终为空...如果没有在数据库中定义外键,这是否也有效?
    • 天啊,我用错了数据库。现在可以了。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多