zoukankan      html  css  js  c++  java
  • EF里一对一、一对多、多对多关系的配置和级联删除

    This is exactly how cascading deletes behaves in EF. Setting Cascade on a relation in EF designer instructs EF to execute DELETE statement for each loaded realated entity. It doesn't say anything about ON CASCADE DELETE in the database.

    Setting Cascade deletion when using EF needs two steps:

    • Set Cascade on relation in EF designer. This instruct context that all loaded related entitiesmust be deleted prior to deletion of the parent entity. If this doesn't happen EF will throw exception because internal state will detect that loaded childs are not related to any existing parent entity even the relation is required. I'm not sure if this happens before execution of delete statement of the parent entity or after but there is no difference. EF doesn't reload related entities after executing modifications so it simply doesn't know about cascade deletes triggered in the database.
    • Set ON CASCADE DELETE on relation in database. This will instruct SQL to delete all related records which were not loaded to context in the time of deleting the parent.

    The implementation of cascade deletes in EF is strange and quite inefficient but this is how it behaves and if you want to use it, you must modify your application to behaves correctly in this scenario.

    ----------------------------------------------------------------

    You can configure cascade delete on a relationship by using the WillCascadeOnDelete method. If a foreign key on the dependent entity is not nullable, then Code First sets cascade delete on the relationship. If a foreign key on the dependent entity is nullable, Code First does not set cascade delete on the relationship, and when the principal is deleted the foreign key will be set to null.

    You can remove these cascade delete conventions by using:

    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>()
    modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>()

    The following code configures the relationship to be required and then disables cascade delete.

    modelBuilder.Entity<Course>() 
        .HasRequired(t => t.Department)
        .WithMany(t => t.Courses)
        .HasForeignKey(d => d.DepartmentID)
        .WillCascadeOnDelete(false);

    参考

    EF里一对一、一对多、多对多关系的配置和级联删除

    EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射

    Enabling Cascade Delete

    Entity Framework 4.3 delete cascade with code first (Poco)

    Cascading Deletes in LINQ to SQL

    Cascading deletes with Entity Framework - Related entities deleted by EF

  • 相关阅读:
    mysql批量导入删除
    sql查重去除id最小值
    Rest构建分布式 SpringCloud微服务架构项目
    Django模板语言及视图
    Django模板语言
    面向对象进阶
    初识面向对象
    os模块和sys模块
    random模
    时间模块
  • 原文地址:https://www.cnblogs.com/HQFZ/p/4519848.html
Copyright © 2011-2022 走看看