one to many 一对多关系
实体对应数据库中表来体现一对多关系,可以通过两种方式进行实现,约定+注释和fluent api的方式,本次实现使用的是fluent api,示例:一个项目类(Project)对应多次回款(payback),其中Project的主键为payback的外键,代码如下:
Project:
public partial class Project
{
public Project()
{
Users = new HashSet<User>();
PayBack = new HashSet<PayBack>();
}
public virtual ICollection<User> Users
{
get;
set;
}
public virtual ICollection<PayBack> PayBack
{
get;
set;
}
}
[Table("PROJECTS")]
public partial class Project
{
[Key]
[Column("ID")]
public int Id
{
get;
set;
}
[Column("PROJECTNAME")]
[Required]
[StringLength(250)]
public string ProjectName
{
get;
set;
}
[Column("PROJECTCODE")]
public string ProjectCode
{
get;
set;
}
[Column("STARTDATE")]
[Required]
public DateTime StartDate
{
get;
set;
}
[Column("FINISHTIME")]
public DateTime FinishTime
{
get;
set;
}
[Column("SOURCECODEID")]
public int SourceCodeID
{
get;
set;
}
}
PayBack:
public partial class PayBack
{
public virtual Project Project
{
get;
set;
}
[Column("PROJECTID")]
public int? PROJECTID
{
get;
set;
}
}
[Table("PAYBACK")]
public partial class PayBack
{
[Key]
[Column("ID")]
public int Id
{
get;
set;
}
[Column("AMOUNTOFMONEY")]
public double AmountOfMoney
{
get;
set;
}
}
本例子中通过注释的方式定义表明,字段名,主键等信息,也可以通过约定的方式定义,比如主键可以字段中末尾包含ID(不区分大小写)的方式定义主键,包括外键可以跟关联表主键同名的属性来定义,也可以使用本例中的方式通过注释进行定义。需要详细了解可以参考点击这里。
fluent api:
public class ProjectEntityConfiguration : EntityTypeConfiguration<Project>
{
public ProjectEntityConfiguration()
{
HasKey(d => d.Id);
HasMany(d => d.PayBack)
.WithOptional(d => d.Project)
.HasForeignKey(p=>p.PROJECTID);
}
}
haskey定义主键,实体中已经通过注释的方式进行了定义,这里说明也可通过fluent api的方式进行定义。hasmany对应多个payback,withoptional可选的关系,也就是关系可以为空,hasforeignkey定义外键。
这里需要注意两点:
1.必须要在payback中定义外键。
2.如果关系为可空,那么外键的数据类型需要定义为int?。