外键关系

时间:2015-02-27 17:15:50

标签: asp.net entity-framework ef-code-first

我正在尝试使用以下两个类设置外键。 我想使用pAcqType作为枚举,并将类型的名称存储在另一个表中。我应该如何设置我的课程呢?

public class Property
{
    [Key]
    public int pID { get; set; }
    public string pAddress { get; set; }
    public string pCounty { get; set; }
    public string pCity { get; set; }
    public string pState { get; set; }
    public string pzip { get; set; }
    public virtual PropertyAcquisitionType pAcqType { get; set; }    <-- foreign key      
}

public class PropertyAcquisitionType
{
    [Key]        
    public int patID { get; set; }        
    public string patName { get; set; }
}

更新

丹让我思考。我尝试了下面的内容,似乎已经解决了。 它像我想要的那样在桌面上设置外键。而且它甚至没有要求对另一张表进行反转。

    public int? pAcqType { get; set; }
    [ForeignKey("pAcqType")]
    public PropertyAcquisitionType patID { get; set; }

1 个答案:

答案 0 :(得分:1)

是否需要外键(数据库中为NOT NULL)?

public int pAcqTypeId { get; set; }
[ForeignKey("pAcqTypeId")]
public virtual PropertyAcquisitionType pAcqType { get; set; }

否则,

public int? pAcqTypeId { get; set; }
[ForeignKey("pAcqTypeId")]
public virtual PropertyAcquisitionType pAcqType { get; set; }

然后在你的另一个班级中,添加一个反比关系:

public class PropertyAcquisitionType
{
    [Key]        
    public int patID { get; set; }        
    public string patName { get; set; }
    [InverseProperty("pAcqType")]
    public virtual ICollection<Property> pOfThisType { get; set; }
}

以下是使用fluent API定义关系的一种方法(实体类中没有属性)。请注意,使用此方法时,您不需要在properties实体上添加PropertyAcquisitionType属性以满足关系的反面,因为.WithMany()告诉EF它需要知道的内容:

public class MyDbContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Property>()
            .HasKey(x => x.pID)
            .HasRequired(x => x.pAcqType) // or HasOptional if using int?
            .WithMany() // or WithMany(x => x.pOfThisType) if you want to add / keep the inverse property
            .HasForeignKey(x => x.pAcqTypeId)
        ;
    }
}