如何使用不是第二个对象的主键的键创建导航属性
本文关键字:导航 属性 创建 对象 何使用 第二个 | 更新日期: 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);
}
}
我在问题中问的情况,其中Foo1
和Foo2
都链接到Bar
与不同的键(在Bar
方面)不能在EF5中完成(更多细节在帖子中这个问题几乎是重复的)。但是,如果您的所有对象(这里的Foo1
和Foo2
)需要映射到上相同的列(具有唯一性约束),即使它不是映射中另一个对象(这里的Bar
)的PK,您也可以将该列设置为键。此外,如果您不想为Foo1
和Foo2
使用相同的列,但您永远不会在上下文的同一实例中需要Foo1
和Foo2
,则可以使用动态映射,但这很危险并且有很多复杂性。