我是实体框架的新手,我的英语不是很好,对不起,如果我写错了什么。我想使用以下示例与实体框架 6 建立一对多关系中的单向关联:
public class Person
{
public int personId;
public string Name;
.
.
.
//public ICollection<Phone> Phones { get; set; } //I don't want this nav property
}
public class Phone
{
public int phoneId;
public string number;
public Person myPerson { get; set; }
}
在此类中,一个人有很多电话,所以一个电话只有一个人(1 到 1...*),但我想在电话中创建导航属性,而不是在个人中创建导航属性。
如何为映射创建与 Fluent API 的关联?
使用以下映射
modelBuilder.Entity<Phone>().HasRequired(p => p.myPerson).WithMany();
- HasRequired 配置电话所需的关系(即需要具有人员 ID)
- WithMany() 将关系配置为必需:许多端没有导航属性
请考虑阅读使用流畅 API 配置关系一文。
首先,考虑到您在谢尔盖的回答中更改了问题,您需要更清楚地了解自己想要什么。
考虑到这一点,这就是您的类的外观(是的,支持导航属性继承):
public class Person
{
public int personId { get; set; }
public string Name { get; set; }
}
public abstract class Phone
{
public int phoneId { get; set; }
public int personId { get; set; }
public Person myPerson { get; set; }
}
public class PhoneFixedLine : Phone
{ }
public class PhoneCellPhone : Phone
{ }
注意:注意Person
和Phone
类中的getters和setter。
您希望使用 Phone
类中的导航属性进行单向映射。
由于要映射派生类,因此需要遵循继承策略,有关详细信息,请参阅此链接。
我将遵循TPC策略,其中仅映射具体类。
在OnModelCreatingMethod
执行以下操作:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<PhoneFixedLine>().HasRequired(p => p.myPerson).WithMany()
.Map(m =>
{
m.MapInheritedProperties();
m.ToTable("FixedPhones");
});
modelBuilder.Entity<PhoneCellPhones>().HasRequired(p => p.myPerson).WithMany()
.Map(m =>
{
m.MapInheritedProperties();
m.ToTable("CellPhones");
});
}
使用此策略将面临标识问题,因为这两个表共享相同的主键phoneId
,在继承策略的链接中有两种处理方法。