c# - EF 代码优先映射混淆

标签 c# entity-framework ef-code-first mapping

我目前正在使用 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),则不应删除任何组织。

问题

  1. 现在,在我的映射配置中,我明确告诉一个组织有很多类(class)并指出外键。然后我在一门类(class)中讲述完全相同的内容,只是反过来。 这种双向映射真的有必要吗,或者我可以跳过其中一侧吗? EF 需要多少映射配置才能理解我的目标?我真的不想破坏我的代码,也不想破坏我的脑袋。

  2. 根据我的目标,我需要一些实体删除处理。我知道这是使用 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/

相关文章:

c# - 我怎样才能为 php 做 c# 字典呢?循环类

c# - 自定义身份验证 OpenRasta

c# - 将键盘快捷键添加到控制台应用程序 - 单声道兼容

.net - 第一个代码 : Database only created after execute certain code?

c# - 如何在 Code First 模型中设置 bool 值的默认值?

c# - Windows Phone 7.5 芒果应用程序大小限制

c# - 如何使用 Entity Framework 仅保存特定项目?

linux - 在 Linux 服务器中使用 EF 的数据访问库

.net - Entity Framework 代码优先 : select data from table with discriminator

c# - Entity Framework 使用 newsequentialid() 作为 Guid Key