我正在使用 Entity Framework Fluent API 执行代码优先方法映射配置,因为我遇到了一些令人困惑的情况。
我有两个课程:组织和课程。
public class Organisation {
public int Id { get; set; }
public virtual ICollection<Course> Courses { get; set; }
}
public class Course {
public int Id { get; set; }
public int OrganisationId { get; set; }
}
我的映射配置如下:
public class OrganisationSchema : EntityTypeConfiguration<Organisation>
{
public OrganisationSchema()
{
ToTable(typeof(Organisation).Name);
HasKey(x => x.Id);
HasMany(x => x.Courses).WithRequired(x => x.Organisation).HasForeignKey(x => x.OrganisationId);
}
}
public class CourseSchema : EntityTypeConfiguration<Course>
{
public CourseSchema()
{
ToTable(typeof(Course).Name);
HasKey(x => x.Id);
HasRequired(x => x.Organisation).WithMany(x => x.Courses).HasForeignKey(x => x.OrganisationId);
}
}
我的模型的目标是拥有一个包含许多课程的组织,而课程只有一个组织。
此外,如果我删除组织,我希望EF删除所有相关的课程。但是,如果我删除课程,则不应删除任何组织。
现在,在我的映射配置中,我明确告诉一个组织有很多课程并指出外键。然后我在一个课程中讲述完全相同的内容,反之亦然。 这种双向映射是否真的不必要,或者我可以跳过其中一个方面吗? EF了解我的目标需要多少映射配置?我真的不想吹我的代码,也不想吹我的头。
根据我的目标,我需要一些实体删除处理。我知道这是使用WillCascadeOnDelete()
扩展名配置的,但我不明白这个扩展名。 我应该在映射配置中设置WillCascadeOnDelete()扩展名;哪一方 - 或两者兼而有之?它是如何影响的?什么是布尔参数值告诉?
答案 0 :(得分:1)
public class Organisation {
public int Id { get; set; }
public virtual ICollection<Course> Courses { get; set; }
}
public class Course {
public int Id { get; set; }
public virtual Organisation Organisation { get; set; }
}
public class OrganisationSchema : EntityTypeConfiguration<Organisation>
{
public OrganisationSchema()
{
ToTable(typeof(Organisation).Name);
HasMany(x => x.Courses).WithRequired(x => .Organisation).WillCascadeOnDelete();
}
}
我认为上述配置应该适合您的要求。它使用一些约定来定义外键并将映射配置保持在最低限度。