EF代码优先映射混淆
本文关键字:映射 代码 EF | 更新日期: 2023-09-27 18:12:25
我目前正在使用实体框架流畅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()扩展在我的映射配置;是哪一方,还是两者都有?它有什么影响?布尔参数值说明了什么?
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();
}
}
我认为上面的配置应该可以满足你的要求。它使用一些约定来定义外键,并将映射配置保持在最小。