{"id":2267,"date":"2023-06-13T13:58:11","date_gmt":"2023-06-13T06:58:11","guid":{"rendered":"https:\/\/csharptutorial.net\/?page_id=2267"},"modified":"2023-06-13T13:59:21","modified_gmt":"2023-06-13T06:59:21","slug":"ef-core-delete","status":"publish","type":"page","link":"https:\/\/www.csharptutorial.net\/entity-framework-core-tutorial\/ef-core-delete\/","title":{"rendered":"EF Core Delete"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you&#8217;ll learn how to delete data from the database tables in EF Core.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Setting up a sample project<\/h2>\n\n\n\n<p>First, download the HR sample project:<\/p>\n\n\n\n<p><a href=\"https:\/\/csharptutorial.net\/wp-content\/uploads\/2023\/06\/EFCoreHR.zip\" target=\"_blank\" rel=\"noreferrer noopener\">Download EF Core HR Sample Project<\/a><\/p>\n\n\n\n<p>Second, run the <code>Add-Migration<\/code> command in the Package Manager Console (PMC) to create a new migration:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\">Add-Migration Initial<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Third, execute the <code>Update-Database<\/code> command in the PMC to create a new HR database and tables in the local SQL Server:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\">Update-Database<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Perform a simple delete<\/h2>\n\n\n\n<p>We&#8217;ll work with <code>Departments<\/code> &amp; <code>Employees<\/code> tables:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/csharptutorial.net\/wp-content\/uploads\/2023\/06\/EF-Core-Departments-and-Emloyees-Tables.png\" alt=\"\" class=\"wp-image-2218\" width=\"439\" height=\"181\" srcset=\"https:\/\/www.csharptutorial.net\/wp-content\/uploads\/2023\/06\/EF-Core-Departments-and-Emloyees-Tables.png 585w, https:\/\/www.csharptutorial.net\/wp-content\/uploads\/2023\/06\/EF-Core-Departments-and-Emloyees-Tables-300x124.png 300w\" sizes=\"auto, (max-width: 439px) 100vw, 439px\" \/><\/figure>\n\n\n\n<p>The following <a href=\"https:\/\/csharptutorial.net\/entity-framework-core-tutorial\/ef-core-insert\/\">inserts<\/a> a new department to the <code>Departments<\/code> table:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">using<\/span> HR;\n\n<span class=\"hljs-keyword\">using<\/span> <span class=\"hljs-keyword\">var<\/span> context = <span class=\"hljs-keyword\">new<\/span> HRContext();\n\n<span class=\"hljs-keyword\">var<\/span> department = <span class=\"hljs-keyword\">new<\/span> Department() { Name = <span class=\"hljs-string\">\"Logistics\"<\/span> };\ncontext.Departments.Add(department);\n\ncontext.SaveChanges();<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>Departments<\/code> table will contain a row with Id 1:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"plaintext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">Id          Name\n----------- ---------------\n1           Logistics<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">plaintext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>To delete a row from the database, you follow these steps:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>First, get the entity from the database.<\/li>\n\n\n\n<li>Second, remove the entity from the <code><code>DbSet<\/code><\/code> by calling <code><code>DbSet<\/code><\/code>&#8216;s <code>Remove()<\/code> method.<\/li>\n\n\n\n<li>Third, apply the change to the database by calling the <code>SaveChanges()<\/code> method.<\/li>\n<\/ul>\n\n\n\n<p>For example, the following gets the department with Id 1 and removes it from the database:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">using<\/span> HR;\n\n<span class=\"hljs-keyword\">using<\/span> <span class=\"hljs-keyword\">var<\/span> context = <span class=\"hljs-keyword\">new<\/span> HRContext();\n\n<span class=\"hljs-comment\">\/\/ get the deparment<\/span>\n<span class=\"hljs-keyword\">var<\/span> department = context.Departments.Find(<span class=\"hljs-number\">1<\/span>);\n\n<span class=\"hljs-keyword\">if<\/span>(department <span class=\"hljs-keyword\">is<\/span> not <span class=\"hljs-literal\">null<\/span>)\n{\n    <span class=\"hljs-comment\">\/\/ remove it<\/span>\n    context.Departments.Remove(department);\n    \n    <span class=\"hljs-comment\">\/\/ commit the change to the database<\/span>\n    context.SaveChanges();\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>First, get the department with id 1 from the database:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">var<\/span> department = context.Departments.Find(<span class=\"hljs-number\">1<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>EF Core executes a <code><a href=\"https:\/\/csharptutorial.net\/entity-framework-core-tutorial\/ef-core-select\/\">SELECT<\/a><\/code> statement that retrieves a department by id:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\">-- &#91;Parameters=&#91;@__p_0=<span class=\"hljs-string\">'1'<\/span>], CommandType=<span class=\"hljs-string\">'Text'<\/span>, CommandTimeout=<span class=\"hljs-string\">'30'<\/span>]\n<span class=\"hljs-function\">SELECT <span class=\"hljs-title\">TOP<\/span>(<span class=\"hljs-params\"><span class=\"hljs-number\">1<\/span><\/span>) &#91;d].&#91;Id], &#91;d].&#91;Name]\nFROM &#91;Departments] AS &#91;d]\nWHERE &#91;d].&#91;Id]<\/span> = @__p_0<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, remove the department from the <code>DbSet<\/code> and call the <code>SaveChanges()<\/code> to remove the department from the database:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">if<\/span>(department <span class=\"hljs-keyword\">is<\/span> not <span class=\"hljs-literal\">null<\/span>)\n{\n    <span class=\"hljs-comment\">\/\/ remove it<\/span>\n    context.Departments.Remove(department);\n    \n    <span class=\"hljs-comment\">\/\/ commit the change to the database<\/span>\n    context.SaveChanges();\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>EF Core will perform a simple <code><a href=\"https:\/\/www.sqlservertutorial.net\/sql-server-basics\/sql-server-delete\/\" target=\"_blank\" rel=\"noreferrer noopener\">DELETE<\/a><\/code> statement that deletes the department with id 1 from the Departments table:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"SQL (Structured Query Language)\" data-shcb-language-slug=\"sql\"><span><code class=\"hljs language-sql\"><span class=\"hljs-comment\">-- &#91;Parameters=&#91;@p0='1'], CommandType='Text', CommandTimeout='30']<\/span>\n<span class=\"hljs-keyword\">SET<\/span> IMPLICIT_TRANSACTIONS <span class=\"hljs-keyword\">OFF<\/span>;\n<span class=\"hljs-keyword\">SET<\/span> NOCOUNT <span class=\"hljs-keyword\">ON<\/span>;\n<span class=\"hljs-keyword\">DELETE<\/span> <span class=\"hljs-keyword\">FROM<\/span> &#91;Departments]\n<span class=\"hljs-keyword\">OUTPUT<\/span> <span class=\"hljs-number\">1<\/span>\n<span class=\"hljs-keyword\">WHERE<\/span> &#91;<span class=\"hljs-keyword\">Id<\/span>] = @p0;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">SQL (Structured Query Language)<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">sql<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Cascade Delete<\/h2>\n\n\n\n<p>The following program inserts an employee with a department into the <code>Employees<\/code> and <code>Departments<\/code> tables:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">using<\/span> HR;\n\n<span class=\"hljs-keyword\">using<\/span> <span class=\"hljs-keyword\">var<\/span> context = <span class=\"hljs-keyword\">new<\/span> HRContext();\n\n<span class=\"hljs-keyword\">var<\/span> employee = <span class=\"hljs-keyword\">new<\/span> Employee()\n{\n    FirstName = <span class=\"hljs-string\">\"Jane\"<\/span>,\n    LastName = <span class=\"hljs-string\">\"Doe\"<\/span>,\n    Salary = <span class=\"hljs-number\">120<\/span>_000,\n    JoinedDate = <span class=\"hljs-keyword\">new<\/span> DateTime(<span class=\"hljs-number\">2023<\/span>, <span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">1<\/span>),\n    Department = <span class=\"hljs-keyword\">new<\/span> Department() { Name = <span class=\"hljs-string\">\"IT\"<\/span> }\n};\n\ncontext.Add(employee);\ncontext.SaveChanges();<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>Employees<\/code> table (not all fields):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"plaintext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">Id          FirstName       LastName        DepartmentId\n----------- --------------- --------------- ------------\n1           Jane            Doe             2<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">plaintext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>Departments<\/code> table:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"plaintext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">Id          Name\n----------- ---------------\n2           IT<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">plaintext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>DepartmentId<\/code> column of the <code>Employees<\/code> table references the <code>Id<\/code> column of the <code>Employees<\/code> table. Due to the default <a href=\"https:\/\/www.sqlservertutorial.net\/sql-server-basics\/sql-server-foreign-key\/\" target=\"_blank\" rel=\"noreferrer noopener\">foreign key<\/a> constraint settings, when you delete a department, all employees that associate with the department will also be removed automatically by the database server. It&#8217;s called <code>ON DELETE CASCADE<\/code> in the database.<\/p>\n\n\n\n<p>For example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">using<\/span> HR;\n\n<span class=\"hljs-keyword\">using<\/span> <span class=\"hljs-keyword\">var<\/span> context = <span class=\"hljs-keyword\">new<\/span> HRContext();\n\n<span class=\"hljs-comment\">\/\/ find department id 2 <\/span>\n<span class=\"hljs-keyword\">var<\/span> department = context.Departments.Find(<span class=\"hljs-number\">2<\/span>);\n\n<span class=\"hljs-keyword\">if<\/span> (department <span class=\"hljs-keyword\">is<\/span> not <span class=\"hljs-literal\">null<\/span>)\n{\n    <span class=\"hljs-comment\">\/\/ delete the department<\/span>\n    context.Departments.Remove(department);\n    context.SaveChanges();\n\n    <span class=\"hljs-comment\">\/\/ all employees associcated with the department<\/span>\n    <span class=\"hljs-comment\">\/\/ will be removed by the database<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>If you view the data of the <code>Departments<\/code> and <code>Employees<\/code> tables, you&#8217;ll see that both tables are empty<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>To delete an entity, first, get it from the database, then remove it from the <code>DbSet<\/code>, and call the <code>SaveChanges()<\/code> to delete it from the database.<\/li>\n<\/ul>\n<div class=\"helpful-block-content\" data-title=\"\">\n\t<header>\n\t\t<div class=\"wth-question\">Was this tutorial helpful ?<\/div>\n\t\t<div class=\"wth-thumbs\">\n\t\t\t<button\n\t\t\t\tdata-post=\"2267\"\n\t\t\t\tdata-post-url=\"https:\/\/www.csharptutorial.net\/entity-framework-core-tutorial\/ef-core-delete\/\"\n\t\t\t\tdata-post-title=\"EF Core Delete\"\n\t\t\t\tdata-response=\"1\"\n\t\t\t\tclass=\"wth-btn-rounded wth-yes-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\tclass=\"feather feather-thumbs-up block w-full h-full\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> Yes <\/span>\n\t\t\t<\/button>\n\n\t\t\t<button\n\t\t\t\tdata-response=\"0\"\n\t\t\t\tdata-post=\"2267\"\n\t\t\t\tdata-post-url=\"https:\/\/www.csharptutorial.net\/entity-framework-core-tutorial\/ef-core-delete\/\"\n\t\t\t\tdata-post-title=\"EF Core Delete\"\n\t\t\t\tclass=\"wth-btn-rounded wth-no-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> No <\/span>\n\t\t\t<\/button>\n\t\t<\/div>\n\t<\/header>\n\n\t<div class=\"wth-form hidden\">\n\t\t<div class=\"wth-form-wrapper\">\n\t\t\t<div class=\"wth-title\"><\/div>\n\t\t\t\n\t\t\t<textarea class=\"wth-message\"><\/textarea>\n\n\t\t\t<button class=\"btn btn-primary wth-btn-submit\">Send<\/button>\n\t\t\t<button class=\"btn wth-btn-cancel\">Cancel<\/button>\n\t\t\n\t\t<\/div>\n\t<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>In this tutorial, you&#8217;ll learn how to delete data from the database tables in EF Core. You will also understand how ON DELETE CASCADE works.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":1970,"menu_order":18,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2267","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/2267","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/comments?post=2267"}],"version-history":[{"count":3,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/2267\/revisions"}],"predecessor-version":[{"id":2271,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/2267\/revisions\/2271"}],"up":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1970"}],"wp:attachment":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/media?parent=2267"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}