实体框架单向关联一对多



我是实体框架的新手,我的英语不是很好,对不起,如果我写错了什么。我想使用以下示例与实体框架 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 
{  }
注意:

注意PersonPhone类中的getterssetter

您希望使用 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,在继承策略的链接中有两种处理方法。

最新更新