我使用Code First方法创建我的数据库,这种方法到目前为止工作得很好。但是我有一个小问题,EF6似乎无法理解,或者我做错了。
我的课程Project
有一个CreatedBy
类型的属性Person
和Members
类型的另一个属性ICollection<Person>
;
public class Project
{
// ...
public Person CreatedBy { get; set; }
public virtual ICollection<Person> Members { get; set; }
}
在课程Person
中,我添加了以下属性:
public virtual ICollection<Project> Projects { get; set; }
告诉EF6两个类之间应该存在多对多关系。
如果我在Add-Migration
类中注释Update-Database
的Visual Studio中运行CreatedBy
和Project
,那么会发生Project <-> Person
表将在数据库中创建。
如果我取消注释CreatedBy
属性并再次运行相同的脚本,Project <-> Person
表将被删除,Project
和Person
表将获得一个包含ForeignKey的新列在两者之间将其改为一对一的关系。
我如何使用Code First在我的Project
和Person
类之间建立关系,这样我就可以知道1对多(1个人可以创建多个项目)和多对多(很多人可以添加到很多项目中)?
答案 0 :(得分:3)
您需要为配置实体使用Fluent API:
class ProjectConfiguration : EntityTypeConfiguration<Project>
{
public ProjectConfiguration()
{
HasRequired(e => e.CreatedBy).WithMany(); // one-to-many
HasMany(e => e.Members).WithMany(); //many-to-many
}
}
public class Context : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ProjectConfiguration());
}
}
有关Fluent API的更多详细信息:http://msdn.microsoft.com/en-us/data/jj591617.aspx
使用Fluent API配置关系:http://msdn.microsoft.com/en-us/data/jj591620
答案 1 :(得分:0)
我还没有对此进行验证,但是如果您为Created by指定了明确的外键,则应该足以区分这两种不同的关系:
// make nullable if CreatedBy is not required
[ForeignKey("CreatedBy")]
public int CreatedById { get; set; }
public Person CreatedBy { get; set; }