如何使用不是第二个对象的主键的键创建导航属性

本文关键字:导航 属性 创建 对象 何使用 第二个 | 更新日期: 2023-09-27 18:05:33

在EF5中,使用代码优先的方法和流畅的API,如何基于不是另一个表的主键的键创建导航属性(多到1)?

我的数据库模型是这样的,和我不能改变它:

  • TableFoo1
    • Foo1ID int (key)
    • Field1 int
    • varchar值
  • TableFoo2
    • Foo2ID int (key)
    • Field1 int
    • varchar值
  • TableBar
    • BarID int (key)
    • Field1 int
    • varchar值

我想要我的这些实体:

public class Foo1
{
    public int Foo1ID { get; set; }
    public int BarID { get; set; }    //It corresponds Bar.ID
    public string Value { get; set; }
    public Bar Bar { get; set; }
}
public class Foo2
{
    public int Foo2ID { get; set; }
    public int BarID { get; set; }    //It corresponds to Bar.Field1, NOT Bar.ID
    public string Value { get; set; }
    public Bar Bar { get; set; }
}
public class Bar
{
    public int ID { get; set; }
    public int Field1 { get; set; }
    public string Value { get; set; }
}

这是我的地图(第二张是不完整的):

public  class Foo1Map : EntityTypeConfiguration<Foo1>
{
    public Foo1Map()
    {
        this.HasKey(e => e.Foo1ID);
        // Links to Bar's Primary Key, yay, it's easy.
        this.HasRequired(e => e.Bar).WithMany().HasForeignKey(e => e.BarID);
    }
}
public  class Foo2Map : EntityTypeConfiguration<Foo2>
{
    public Foo2Map()
    {
        this.HasKey(e => e.Foo2ID);
        // No clues of how to links to Bar's other unique column, but not primary key.
        this.HasRequired(e => e.Bar).WithMany()........?
    }
}
public class BarMap : EntityTypeConfiguration<Bar>
{
    public BarMap()
    {
        this.HasKey(e => e.BarID);
    }
}

如何使用不是第二个对象的主键的键创建导航属性

我在问题中问的情况,其中Foo1Foo2都链接到Bar与不同的键(在Bar方面)不能在EF5中完成(更多细节在帖子中这个问题几乎是重复的)。但是,如果您的所有对象(这里的Foo1Foo2)需要映射到上相同的列(具有唯一性约束),即使它不是映射中另一个对象(这里的Bar)的PK,您也可以将该列设置为键。此外,如果您不想为Foo1Foo2使用相同的列,但您永远不会在上下文的同一实例中需要Foo1Foo2,则可以使用动态映射,但这很危险并且有很多复杂性。