4

DBContext クラスは

public class VGDB : DbContext
    {        
        public DbSet<Planet> Planets { get; set; }
    }

モデルは次のようになります。

public class Planet
    {
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }

        ...

        public List<Building> Constructions { get; set; } 
    }


public class Building
    {
        [Key]
        public int Id { get; set; }
        public decimal Lvl { get; set; }
        public string Type { get; set; }
    }

リポジトリ クラス:

public class VGDBRepository
    {
        private readonly VGDB _vgdb;
        ...
        public void RemovePlanets()
        {
            foreach (Planet planet in _vgdb.Planets)
            {
                _vgdb.Planets.Remove(planet);
            }
            _vgdb.SaveChanges();
        }
        ...
    }

Entity Framework は、フィールドで関連付けられたPlanetsとの2 つのテーブルを持つデータベースを作成します。クラスのメソッドを呼び出すと、惑星テーブルから惑星レコードが削除され、削除された惑星に関連するすべての建物のフィールドが建物テーブルに null に設定されますが、削除されないため、データベースに冗長なレコードがあります。戦略を使用してデータベースを作成します。このようなタイプの関連データをEntity Frameworkに強制的に削除させるにはどうすればよいですか???BuildingsPlanet_IdRemovePlanets()VGDBRepositoryPlanet_Idcode-first

4

3 に答える 3

6

削除をカスケードする必要があります。

これを見てください: Stackoverflowの例カスケード削除

そしてこれ: カスケード削除を有効にした最初のMsdnコード

于 2012-07-25T16:35:24.990 に答える
3

私はまったく同じ問題を抱えていましたが、最近それを修正する方法を見つけたので、Dimaから提供された回答に追加するだけだと思いました.

上記の Planet と Building のコードは、関連するオブジェクトを設定した方法と非常によく似ています。そのような関係を設定することは私にとって理にかなっています。さらに、テーブルは親テーブルへの FK 参照を使用して正しく生成されているように見えました。あなたと同じように、親レコード (あなたの場合は惑星) を削除しても、子レコード (あなたの場合は建物) は残っていましたが、FK フィールドには親 ID が削除されていたため、null 値が含まれていました。ただし、オブジェクトはメモリ内コレクションから削除されたため、同期が取れなくなっていました。私を本当に混乱させたのは、Entity Framework Code First が既定で、このように削除をカスケードすることになっていて、なぜ削除がカスケードされないのか理解できなかったことです。

いろいろ調べてみたところ、Entity Framework がカスケード削除を正しく実行できるように、子クラス内に外部キー アソシエーションを設定する必要があることがわかりました。したがって、コードを次のように変更する必要があります。

    public class Planet
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }

    ...

    public List<Building> Constructions { get; set; } 
}


public class Building
{
    [Key]
    public int Id { get; set; }
    public decimal Lvl { get; set; }
    public string Type { get; set; }
    //Add these two properties to create the Foreign Key Association
    public int planetID { get; set; }
    public Planet planet { get; set; }
}

2 つのプロパティを追加し、データベースで自動移行を実行するとすぐに、期待どおりに削除がカスケードされました。なぜこれを行う必要があるのか​​ についてはまだ少しわかりませんが、それは別の投稿の主題です...これがうまくいった理由を共有したいと思いました。

于 2012-08-15T08:37:11.633 に答える