Entity Framework Code First添加修改及刪除單獨實體

  對於一個單獨實體的一般操做有3種:添加新的實體、修改實體以及刪除實體。sql

  一、添加新的實體數據庫

  Entity Framework Code First添加新的實體經過調用DbSet.Add()方法來實現。ide

using (var ctx = new PortalContext())
{
    var province = new Province
    {
        ProvinceNo = "100000",
        ProvinceName = "測試"
    };

    ctx.Provinces.Add(province);
    ctx.SaveChanges();
}

  代碼運行所執行的SQL語句:測試

exec sp_executesql N'insert [dbo].[Province]([ProvinceNo], [ProvinceName])
values (@0, @1)
select [ProvinceID]
from [dbo].[Province]
where @@ROWCOUNT > 0 and [ProvinceID] = scope_identity()',N'@0 nvarchar(10),@1 nvarchar(50)',@0=N'100000',@1=N'測試'

  二、修改實體spa

  修改數據庫中已經存在的實體記錄:code

using (var ctx = new PortalContext())
{
    var province = ctx.Provinces.Find(35);
    province.ProvinceName = "Test";
    ctx.SaveChanges();
}

  代碼運行所執行的SQL語句:blog

exec sp_executesql N'SELECT 
[Limit1].[ProvinceID] AS [ProvinceID], 
[Limit1].[ProvinceNo] AS [ProvinceNo], 
[Limit1].[ProvinceName] AS [ProvinceName]
FROM ( SELECT TOP (2) 
    [Extent1].[ProvinceID] AS [ProvinceID], 
    [Extent1].[ProvinceNo] AS [ProvinceNo], 
    [Extent1].[ProvinceName] AS [ProvinceName]
    FROM [dbo].[Province] AS [Extent1]
    WHERE [Extent1].[ProvinceID] = @p0
)  AS [Limit1]',N'@p0 int',@p0=35
exec sp_executesql N'update [dbo].[Province]
set [ProvinceName] = @0
where ([ProvinceID] = @1)
',N'@0 nvarchar(50),@1 int',@0=N'Test',@1=35

  三、刪除實體ci

  Entity Framework Code First添加新的實體經過調用DbSet.Remove()方法來實現。it

  1>、根據已實例化的實體刪除io

  在根據已實例化的實體來刪除實體時,一般須要先從數據庫中讀取該實體的數據,再調用DbSet.Remove()來刪除,並經過DbContext到數據庫中去刪除該記錄。

using (var ctx = new PortalContext())
{
    var province = ctx.Provinces.Find(35);
    ctx.Provinces.Remove(province);
    ctx.SaveChanges();
}

  代碼運行所執行的SQL語句:

exec sp_executesql N'SELECT 
[Limit1].[ProvinceID] AS [ProvinceID], 
[Limit1].[ProvinceNo] AS [ProvinceNo], 
[Limit1].[ProvinceName] AS [ProvinceName]
FROM ( SELECT TOP (2) 
    [Extent1].[ProvinceID] AS [ProvinceID], 
    [Extent1].[ProvinceNo] AS [ProvinceNo], 
    [Extent1].[ProvinceName] AS [ProvinceName]
    FROM [dbo].[Province] AS [Extent1]
    WHERE [Extent1].[ProvinceID] = @p0
)  AS [Limit1]',N'@p0 int',@p0=35
exec sp_executesql N'delete [dbo].[Province]
where ([ProvinceID] = @0)',N'@0 int',@0=35

  2>、根據主鍵刪除實體

  根據主鍵來刪除實體能夠少執行一步從數據庫中根據主鍵值讀取記錄的操做。

using (var ctx = new PortalContext())
{
    var province = new Province { ProvinceID = 36 };
    ctx.Provinces.Attach(province);
    ctx.Provinces.Remove(province);
    ctx.SaveChanges();
}

  或

using (var ctx = new PortalContext())
{
    var province = new Province { ProvinceID = 36 };
    ctx.Entry(province).State = EntityState.Deleted;
    ctx.SaveChanges();
}

  注:EntityState須要引用命名空間using System.Data。

  代碼運行所執行的SQL語句:

exec sp_executesql N'delete [dbo].[Province]
where ([ProvinceID] = @0)',N'@0 int',@0=36

  3>、執行SQL語句刪除

using (var ctx = new PortalContext())
{
    ctx.Database.ExecuteSqlCommand("DELETE FROM [dbo].[Province] WHERE [ProvinceID]=37");
}

  4>、刪除實體關聯數據

  在須要刪除一條記錄時,若存在外鍵表。在須要在刪除主表記錄時,同時對外鍵表中關聯的數據進行操做。

using (var ctx = new PortalContext())
{
    var province = new Province { ProvinceID = 3 };
    ctx.Provinces.Attach(province);

    ctx.Entry(province)
        .Collection(p => p.Cities)
        .Load();

    ctx.Provinces.Remove(province);
    ctx.SaveChanges();
}

  代碼運行所執行的SQL語句:

exec sp_executesql N'SELECT 
[Extent1].[CityID] AS [CityID], 
[Extent1].[ProvinceID] AS [ProvinceID], 
[Extent1].[CityNo] AS [CityNo], 
[Extent1].[CityName] AS [CityName]
FROM [dbo].[City] AS [Extent1]
WHERE [Extent1].[ProvinceID] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=3
exec sp_executesql N'update [dbo].[City]
set [ProvinceID] = null
where ([CityID] = @0)
',N'@0 int',@0=2
exec sp_executesql N'update [dbo].[City]
set [ProvinceID] = null
where ([CityID] = @0)
',N'@0 int',@0=3

......

  從代碼運行以後執行的SQL語句能夠看出,在刪除主表記錄時,若引用的外鍵表設置外鍵運行爲空時,將把關聯記錄的外鍵列的值設置爲null。

  若外鍵引用爲not null時,及City表中的外鍵字段ProvinceID爲not null,則上面的代碼運行以後執行的SQL語句爲:

exec sp_executesql N'SELECT 
[Extent1].[CityID] AS [CityID], 
[Extent1].[ProvinceID] AS [ProvinceID], 
[Extent1].[CityNo] AS [CityNo], 
[Extent1].[CityName] AS [CityName]
FROM [dbo].[City] AS [Extent1]
WHERE [Extent1].[ProvinceID] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=3
exec sp_executesql N'delete [dbo].[City]
where ([CityID] = @0)',N'@0 int',@0=2
exec sp_executesql N'delete [dbo].[City]
where ([CityID] = @0)',N'@0 int',@0=3

......

  在外鍵列容許爲空時,刪除主表記錄,聯帶刪除從表記錄:

using (var ctx = new PortalContext())
{
    var province = new Province { ProvinceID = 5 };
    ctx.Provinces.Attach(province);

    ctx.Entry(province)
        .Collection(p => p.Cities)
        .Load();

    ctx.Provinces.Remove(province);
    foreach (var city in province.Cities)
    {
        ctx.Cities.Remove(city);
    }

    ctx.SaveChanges();
}

  代碼運行以後執行的SQL語句:

exec sp_executesql N'SELECT 
[Extent1].[CityID] AS [CityID], 
[Extent1].[ProvinceID] AS [ProvinceID], 
[Extent1].[CityNo] AS [CityNo], 
[Extent1].[CityName] AS [CityName]
FROM [dbo].[City] AS [Extent1]
WHERE [Extent1].[ProvinceID] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=5
exec sp_executesql N'delete [dbo].[City]
where ([CityID] = @0)',N'@0 int',@0=20
exec sp_executesql N'delete [dbo].[City]
where ([CityID] = @0)',N'@0 int',@0=21

......

exec sp_executesql N'delete [dbo].[Province]
where ([ProvinceID] = @0)',N'@0 int',@0=5
相關文章
相關標籤/搜索