我是实体框架的新手,我的英语不是很好,抱歉如果我写错了。我想使用以下示例在与Entity Framework 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为映射创建此关联?
答案 0 :(得分:3)
使用以下映射
modelBuilder.Entity<Phone>().HasRequired(p => p.myPerson).WithMany();
答案 1 :(得分:0)
首先,你需要更清楚你想要什么,考虑到你在谢尔盖的回答中改变了你的问题。
考虑到这一点,这就是你的类看起来的样子(是的,支持导航属性继承):
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 和 setters 。
您需要使用Phone
类中的导航属性进行单向映射。
由于您要映射派生类,您需要遵循继承策略,有关详细信息,请参阅this link。
我将遵循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
,在继承策略的链接中有两种处理它的方法。