实体框架单向关联一对多

时间:2014-01-03 17:22:22

标签: entity-framework entity-relationship

我是实体框架的新手,我的英语不是很好,抱歉如果我写错了。我想使用以下示例在与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为映射创建此关联?

2 个答案:

答案 0 :(得分:3)

使用以下映射

modelBuilder.Entity<Phone>().HasRequired(p => p.myPerson).WithMany();
  • HasRequired配置电话所需的关系(即需要有人员ID)
  • WithMany()将关系配置为必需的:很多许多侧没有导航属性

考虑阅读Configuring Relationships with the Fluent API文章。

答案 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 
{  }

观察:记住PersonPhone类中的 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,在继承策略的链接中有两种处理它的方法。