2016-05-25 8 views
1

同様の問題が発生しましたが、何がカスケード削除の原因になっているのか分かりません。これらは、私のクラスである:EFとMVCによるデータベース作成後のインデックスビューのSQLエラー(カスケード削除問題)

public class Game 
    { 
     [Key] 
     public int GameID { get; set; } 
     public int GenreID { get; set; } 
     public int ConsoleID { get; set; } 
     public int CompanyID { get; set; } 
     public string Title { get; set; } 
     public string Description { get; set; } 
     public DateTime ReleaseDate { get; set; } 
     public Genre Genre { get; set; } 
     public Console Console { get; set; } 
     public Company Company { get; set; } 
    } 

    public class Console 
    { 
     [Key] 
     public int ConsoleID { get; set; } 
     public int CompanyID { get; set; } 
     public string Title { get; set; } 
     public DateTime ReleaseDate { get; set; } 
     public Company Company { get; set; } 

    } 

    public class Company 
    { 
     [Key] 
     public int CompanyID { get; set; } 
     public string Name { get; set; } 
     public List<Game> Games { get; set; } 
     public List<Console> Consoles { get; set; } 
    } 
` 
    public class Genre 
    { 
     [Key] 
     public int GenreID { get; set; } 
     public int GenreTypeID { get; set; } 
     public string Title { get; set; } 
     public string Description { get; set; } 
     public List<Game> Games { get; set; } 
     public List<Movie> Movies { get; set; } 
     public List<Serie> Series { get; set; } 
    } 

    public class Movie 
    { 
     [Key] 
     public int ID { get; set; } 
     public int GenreID { get; set; } 
     public string Title { get; set; } 
     public string Description { get; set; } 
     public DateTime ReleaseDate { get; set; } 
     public Genre Genre { get; set; } 

    } 

    public class Serie 
    { 
     [Key] 
     public int SerieID { get; set; } 
     public int GenreID { get; set; } 
     public string Title { get; set; } 
     public string Description { get; set; } 
     public DateTime ReleaseDate { get; set; } 
     public Genre Genre { get; set; } 

    } 

私はエラーを取得しています:FOREIGN KEY制約を紹介「FK_dbo.Games_dbo.Consoles_ConsoleID」テーブルの上に "Gamesのサイクルまたは複数のカスケードパスを引き起こす可能性があります。

私は、ゲームを削除するときにカスケードジャンル、企業やコンソールに削除を停止するには、以下のコメントを追加しました:いくつかの簡単なデータと私のデータベースをシードしようとしたとき

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Game>() 
     .HasRequired(x => x.Console) 
     .WithRequiredPrincipal() 
     .WillCascadeOnDelete(false); 

    modelBuilder.Entity<Game>() 
     .HasRequired(x => x.Genre) 
     .WithRequiredPrincipal() 
     .WillCascadeOnDelete(false); 

    modelBuilder.Entity<Game>() 
     .HasRequired(x => x.Company) 
     .WithRequiredPrincipal() 
     .WillCascadeOnDelete(false); 
    } 

は今、私は次のエラーを取得する:{"The INSERT statement conflicted with the FOREIGN KEY constraint \"FK_dbo.Consoles_dbo.Companies_CompanyID\". The conflict occurred in database \"GAMES_f8b82655d5bd4f0db9cee85535197d4c\", table \"dbo.Companies\", column 'CompanyID'.\r\nThe statement has been terminated."}

これは何を意味していますか?シードデータは次のとおりです。

Game game = new Game 
       { 
        GenreID = 1, 
        ConsoleID = 1, 
        CompanyID = 2, 
        Title = "Final Fantasy I", 
        Description = "Blabla", 
        ReleaseDate = new DateTime(1986, 1, 1) 

       }; 
       db.Games.Add(game); 
       db.SaveChanges(); 

       Game game2 = new Game 
       { 
        GenreID = 1, 
        ConsoleID = 2, 
        CompanyID = 2, 
        Title = "Final Fantasy VII", 
        Description = "Blabla", 
        ReleaseDate = new DateTime(1986, 2, 2) 
       }; 
       db.Games.Add(game2); 
       db.SaveChanges(); 

       Models.Console console = new Models.Console 
       { 
        CompanyID = 3, 
        Title = "NES", 
        ReleaseDate = new DateTime(2015, 1, 1) 
       }; 
       db.Consoles.Add(console); 
       db.SaveChanges(); 

最後のSaveChangesを呼び出すとエラーが発生します。私はそれがこのidの会社がまだ存在しないためかもしれないと思った。しかし、Gameオブジェクトの外部キーについても同じことが言えます。また、エラーがスローされたオブジェクトを確認するために追加したすべてのオブジェクトの後にSaveChangesメソッドを追加しました。

答えて

1

上記のコードに基づいてデータベースを作成したとき、一部のクラスで外部キーが2回表示されているように見えました。したがって、クラス内の外部キーへの明示的な参照を削除しました。

static void Main(string[] args) 
{ 
    Context db = new Context(); 

    Company company = new Company{}; 

    Genre genre = new Genre 
    { 
     GenreTypeID = 1 
    }; 

    Console console = new Console 
    { 
     Title = "NES", 
     ReleaseDate = new DateTime(2015, 1, 1), 
    }; 
    db.Consoles.Add(console); 

    Game game = new Game 
    { 
     Company = company, 
     Console = console, 
     Genre = genre, 
     Title = "Final Fantasy I", 
     Description = "Blabla", 
     ReleaseDate = new DateTime(1986, 1, 1) 

    }; 
    db.Games.Add(game); 

    Game game2 = new Game 
    { 
     Company = company, 
     Console = console, 
     Genre = genre, 
     Title = "Final Fantasy VII", 
     Description = "Blabla", 
     ReleaseDate = new DateTime(1986, 2, 2) 
    }; 
    db.Games.Add(game2); 

    db.SaveChanges(); 

} 

public class Game 
{ 
    [Key] 
    public int GameID { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public DateTime ReleaseDate { get; set; } 
    public Genre Genre { get; set; } 
    public Console Console { get; set; } 
    public Company Company { get; set; } 
} 

public class Console 
{ 
    [Key] 
    public int ConsoleID { get; set; } 
    public string Title { get; set; } 
    public DateTime ReleaseDate { get; set; } 

} 

public class Company 
{ 
    [Key] 
    public int CompanyID { get; set; } 
    public string Name { get; set; } 
    public List<Game> Games { get; set; } 
    public List<Console> Consoles { get; set; } 
} 

public class Genre 
{ 
    [Key] 
    public int GenreID { get; set; } 
    public int GenreTypeID { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public List<Game> Games { get; set; } 
    public List<Movie> Movies { get; set; } 
    public List<Serie> Series { get; set; } 
} 
1

質問1:なぜそれがカスケード削除されるのですか?次の変更を行うことによって、実行するシードメソッドを取得できました。クラスからデータベースを作成するときは、これがEFのデフォルトです。

質問2:エラーは何を意味しますか?一度に複数1つの関連のデータベースアクションを実行する場合、唯一の最後にSaveChangesメソッドを呼び出します。それはあなたが注意点としては3

Models.Console console = new Models.Console 
      { 
       // no company here 
       CompanyID = 3, 
       Title = "NES", 
       ReleaseDate = new DateTime(2015, 1, 1) 
      }; 

のidを持つ会社を持っていないことを意味します。現時点まで実際のデータベースの更新は行われず、必要なすべての関連データが得られます。各ステップの後にSaveChangesを呼び出すと(テストのために行ったことがわかります)、既に関連するデータが存在する必要があります。

関連する問題