我正在尝试使用以下两个类设置外键。 我想使用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; }
答案 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)
;
}
}