我目前正在使用 Entity Framework Fluent API 进行代码优先方法映射配置,因为我遇到了一些令人困惑的场景。
我的模型和映射配置
我有两个类(class):组织和类(class)。
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);
}
}
我的目标
我的模型目标是拥有一个包含许多类(class)的组织,而类(class)只有一个组织。
此外,如果我删除一个组织,我希望 EF 删除所有相关的类(class)。但是,如果我删除类(class),则不应删除任何组织。
问题
现在,在我的映射配置中,我明确告诉一个组织有很多类(class)并指出外键。然后我在一门类(class)中讲述完全相同的内容,只是反过来。 这种双向映射真的有必要吗,或者我可以跳过其中一侧吗? EF 需要多少映射配置才能理解我的目标?我真的不想破坏我的代码,也不想破坏我的脑袋。
根据我的目标,我需要一些实体删除处理。我知道这是使用
WillCascadeOnDelete()
扩展配置的,但我不明白这个扩展。 我应该在我的映射配置中的什么位置设置 WillCascadeOnDelete() 扩展?双方中的哪一方 - 或双方?它如何影响? bool 参数值说明了什么?
最佳答案
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();
}
}
我认为上述配置应该可以满足您的要求。它使用一些约定来定义外键,并将映射配置保持在最低限度。
关于c# - EF 代码优先映射混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24664138/