Entity Framework Code First個別エンティティの追加と削除

15966 ワード

個々のエンティティの通常の操作は、新しいエンティティの追加、エンティティの変更、およびエンティティの削除の3つです.
1、新しいエンティティの追加
Entity Framework Code First新しいエンティティを追加DbSetを呼び出す.Add()メソッドを実装します.
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' '

2、エンティティの変更
データベースにすでに存在するエンティティレコードを変更するには、次の手順に従います.
using (var ctx = new PortalContext())
{
    var province = ctx.Provinces.Find(35);
    province.ProvinceName = "Test";
    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'update [dbo].[Province]
set [ProvinceName] = @0
where ([ProvinceID] = @1)
',N'@0 nvarchar(50),@1 int',@0=N'Test',@1=35

3、エンティティの削除
Entity Framework Code First新しいエンティティを追加DbSetを呼び出す.Remove()メソッドを実装します.
1>、インスタンス化されたエンティティに基づいて削除
インスタンス化するエンティティに基づいてエンティティを削除する場合、通常、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>、プライマリ・キーによるエンティティの削除
プライマリ・キーに基づいてエンティティを削除すると、データベースからプライマリ・キー値に基づいてレコードを読み出す操作を1ステップ少なく実行できます.
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