C# 理解使用fluent api禁用级联删除

C# 理解使用fluent api禁用级联删除,c#,asp.net,asp.net-mvc,entity-framework,ef-fluent-api,C#,Asp.net,Asp.net Mvc,Entity Framework,Ef Fluent Api,我是asp.net的新手,我正在学习一门课程,我们在其中添加了这一部分 使用以下代码禁用oncascade从相关表中删除的代码: 模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder) { modelBuilder.Entity() .HasRequired(a=>a.Gig) .有很多 .WillCascadeOnDelete(假); 基于模型创建(modelBuilder); } 我想了解很多部分: 根据我的理解,为什么我们用考勤类型定义实体方法 在创建方法以

我是asp.net的新手,我正在学习一门课程,我们在其中添加了这一部分 使用以下代码禁用oncascade从相关表中删除的代码:

模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasRequired(a=>a.Gig)
.有很多
.WillCascadeOnDelete(假);
基于模型创建(modelBuilder);
}
我想了解很多部分:

  • 根据我的理解,为什么我们用考勤类型定义实体方法 在创建方法以指定返回值时,而不是在调用方法时,应使用此类型

  • HasRequired
    是什么意思,以及有多种方法意味着什么


  • 级联删除时

    假设有另一种类型的链接指向您的出席情况。因此,在数据库中,另一种类型(表)将有一个外键指向
    考勤

    如果您试图删除数据表中的
    考勤
    记录,则如果该记录在另一个表中使用,则将失败

    使用“级联删除”按钮,将删除除考勤记录之外的所有相关记录

    如果未启用级联删除,则删除将失败,因为其他记录需要此考勤记录

    实体

    无论是从代码生成数据库还是数据库已经存在,表示表的C#类都无法提供所有信息(例如,如果不遵循约定,EF无法知道哪个字段是主键,哪个字段不可为空(请参见下一点),或者表名是否与类名匹配)

    使用
    modelBuilder.Entity()
    可以帮助EF构建“数据库外观的内部模型”。在这种情况下,您可以向EF提供有关“出勤”类型的其他信息

    因此,您可以警告EF此表位于另一个架构中,或者表名不同

    您可能会对所有实体/表执行此操作

    IsRequired
    (在您的示例中未使用,但我发现
    IsRequired
    ,并且
    需要
    ,因此我将解释放在这里)

    IsRequired
    与可空类型一起使用。在数据库中,您可以有一个类型“varchar(x)notnull”,而在C#中,它将是一个“string”。但是字符串在C#中可以为null,因此
    HasRequired
    是一种配置,它会告诉ORM“是的,类型可以为null,但在我的配置中不应该为null”

    因此,当EF生成数据库时,类型将为“NOTNULL”,或者当您的EF在调用数据库之前验证实体时,该检查将完成

    已要求

    它的概念与所需的
    IsRequired
    相同,但有点复杂,因为它是在涉及多个表时使用的。例如,合同和客户,一个合同由一个客户拥有,但一个客户可以有多个合同。因此,在数据库中,Contract表将具有Customer的外键,而在类Contract中,将具有名为Customer的(导航)属性

    public class Contract 
    {
        public Customer Customer { get; set; }
    }
    
    public class Customer
    {       
    }
    
    modelBuilder.Entity<Contract>()
        .HasRequired(c => c.Customer)
    
    在这里,您可以看到Customer类没有合同的(导航)属性。如果您不需要客户对象来达成合同,那么这是非常好的

    现在,如果你想拥有这种能力,你需要这样做:

    public class Customer
    {
       public List<Contract> Contracts { get; set; }       
    }
    
    modelBuilder.Entity<Contract>()
        .HasRequired(c => c.Customer)
        .WithMany(cu => cu.Contracts)
    
    公共类客户
    {
    公共列表契约{get;set;}
    }
    modelBuilder.Entity()
    .HasRequired(c=>c.Customer)
    .有许多(cu=>cu.合同)
    

    在这种情况下,您表示合同与客户有一种必需的关系,并且从客户对象的角度来看,这种关系会导致“合同”属性。

    您的标题与您的问题不匹配。你的问题是关于“级联删除”吗?我不确定是否理解您的第一个问题。@Arcord我的第一个问题与modelBuilder有关。Entity我不明白为什么会在此处放置考勤类型谢谢您的回答,但您能否解释一下使用多种方法的目的我编辑了我的邮件。我发现IsRequired和HasRequired,所以我也修复了它:-)
    public class Customer
    {
       public List<Contract> Contracts { get; set; }       
    }
    
    modelBuilder.Entity<Contract>()
        .HasRequired(c => c.Customer)
        .WithMany(cu => cu.Contracts)