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删除所有相关的课程。但是,如果我删除了一个课程,人们不应该删除任何组织。

<标题>
  1. 现在,在我的映射配置中,我明确地告诉一个组织有许多课程,并指出外键。然后我在一门课上讲同样的内容,只是反过来。这种双向映射是否真的必要,或者我可以跳过其中一边?EF只需要多少映射配置就能理解我的目标?

  2. 根据我的目标,我需要一些实体删除处理。我知道这是通过使用WillCascadeOnDelete()扩展配置的,但我不理解这个扩展。我应该在哪里设置WillCascadeOnDelete()扩展在我的映射配置;是哪一方,还是两者都有?它有什么影响?布尔参数值说明了什么?

EF代码优先映射混淆

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();
    }
}

我认为上面的配置应该可以满足你的要求。它使用一些约定来定义外键,并将映射配置保持在最小。