C# 如何在实体框架中设置OnDelete级联

C# 如何在实体框架中设置OnDelete级联,c#,entity-framework,orm,cascading-deletes,entity-framework-6.1,C#,Entity Framework,Orm,Cascading Deletes,Entity Framework 6.1,我有两张桌子,书类和书籍。一个类别可以有多本书。 我使用的是实体框架。 在删除特定图书类别时,我想删除同一类别的所有图书 我不确定在哪里设置OnDelete=Cascade的规则。 下面是我的代码 如果需要更多信息,请告诉我 1] 我的数据库(bookCatalog.Context.cs) 这是我删除类别的代码 BookCategory deleteBookCat = dbCatlog.BookCategories.SingleOrDefault(p => p.Id.Equals(1));

我有两张桌子,书类和书籍。一个类别可以有多本书。 我使用的是实体框架。 在删除特定图书类别时,我想删除同一类别的所有图书

我不确定在哪里设置OnDelete=Cascade的规则。 下面是我的代码

如果需要更多信息,请告诉我

1] 我的数据库(bookCatalog.Context.cs)

这是我删除类别的代码

BookCategory deleteBookCat = dbCatlog.BookCategories.SingleOrDefault(p => p.Id.Equals(1));
            dbCatlog.BookCategories.Remove(deleteBookCat);
            dbCatlog.SaveChanges();

我认为您可以这样做(recordToDelete是BookCategory的实例)


我得到了解决方案,实际上它不是解决方案,因为在数据库中并没有设置OnDelete级联是错误的。一旦配置好,Ondelete-Cascade-of-EF就无关紧要了。

我会尝试你的建议,但理想情况下我想要的是,是否有任何属性可以设置为Cascade=true。我在网上的某个地方见过,但不记得了。顺便说一句,谢谢你花了4个小时,如果能再尝试解决这个问题,我将不胜感激。设置外键的“级联删除”并将其反映在实体模型中。之后,当您删除某些实体时,数据库将进行必要的操作以保持引用完整性;我不明白你想说什么。你可以在数据库模式中设置级联删除。如果设置了此属性,则只能删除父记录,数据库将删除子记录。我得到了解决方案,问题是我的数据库中未设置OnDelete Cascade。如果在数据库中设置为true,则无需在EF的代码中再次设置。谢谢你的帮助,伙计。你必须把它放在你的模型里。使用设计器打开edmx并在“属性”窗口中选择连接实体的线,您将拥有要更改的OnDelete属性。是的,我已经这样做了,将尝试附加屏幕截图。但仍有错误。您必须记住,EF只会删除触发删除的上下文中当前加载的内容。它不会清除整个数据库,因此请确保所有内容都已加载。我没有加载任何书籍,使用LINQ选择了一个类别,并尝试删除相同的类别,除了要删除该类别的所有书籍外,OnDelete cascade被标记为true。并且存在问题EF将只标记那些要删除的书籍,这些书籍是通过category.books属性加载并可见的。我想你希望End2 OnDelete设置为级联。
namespace LearningEF
{
    using System;
    using System.Collections.Generic;

    public partial class Book
    {
        public Book()
        {

        }

        public int Id { get; set; }
        public string Title { get; set; }
        public decimal Price { get; set; }
        public Nullable<int> Category { get; set; }

        public virtual BookCategory BookCategory { get; set; }

    }
}
namespace LearningEF
{
    using System;
    using System.Collections.Generic;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;

    public partial class BookCategory
    {

        public BookCategory()
        {
            this.Books = new HashSet<Book>();
        }

        public int Id { get; set; }
        public string Name { get; set; }

        public virtual ICollection<Book> Books { get; set; }

    }
}
<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="3.0" xmlns:edmx="http://schemas.microsoft.com/ado/2009/11/edmx">
 <!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
  <edmx:Designer xmlns="http://schemas.microsoft.com/ado/2009/11/edmx">
    <!-- Diagram content (shape and connector positions) -->
    <edmx:Diagrams>
      <Diagram DiagramId="3da0fdfb8bce456da4d1833a61ed8d58" Name="Diagram1">
        <EntityTypeShape EntityType="bookCatalogModel.Author" Width="1.5" PointX="0.75" PointY="1.25" IsExpanded="true" />
        <EntityTypeShape EntityType="bookCatalogModel.BookCategory" Width="1.5" PointX="0.75" PointY="5.25" IsExpanded="true" />
        <EntityTypeShape EntityType="bookCatalogModel.Book" Width="1.5" PointX="3" PointY="0.875" IsExpanded="true" />
        <EntityTypeShape EntityType="bookCatalogModel.sysdiagram" Width="1.5" PointX="2.75" PointY="4.75" IsExpanded="true" />
        <AssociationConnector Association="bookCatalogModel.FK_Books_BookCategories" ManuallyRouted="false"   />
        <AssociationConnector Association="bookCatalogModel.BookAuthors" ManuallyRouted="false" />
      </Diagram>
    </edmx:Diagrams>
  </edmx:Designer>
</edmx:Edmx>
An exception of type 'System.Data.Entity.Infrastructure.DbUpdateException' occurred in EntityFramework.dll but was not handled in user code

Additional information: An error occurred while updating the entries. See the inner exception for details.
BookCategory deleteBookCat = dbCatlog.BookCategories.SingleOrDefault(p => p.Id.Equals(1));
            dbCatlog.BookCategories.Remove(deleteBookCat);
            dbCatlog.SaveChanges();
  recordToDelete.Books.ToList().ForEach(p => db.Books.Remove(p));


  db.BookCategory(recordToDelete).State = EntityState.Deleted;


  db.SaveChanges();