エラー内容
- 【ASP.NET MVC5】ちょっとしたお試しをするときに土台となるアプリの作り方チュートリアル – oki2a24 の手順通りに進めていくと、途中でエラーとなってしまう。
- モデルクラス作成後に、コントローラーを自動生成しようとするとエラーとなる。
- プロパティとして、外部キーを書いた場合に発生
- エラーメッセージ
エラー
選択したコードジェネレータを実行中にエラーが発生しました : ‘Key already exists in table.’
解決方法のポイント
作業の順番を変えることでエラーを回避できた。
NG となる今までの手順
- スキャフォールディングでコントローラー作成
→ この時点でエラー発生して先に進めない。 - DbContext クラスが自動的に生成
- マイグレーション (Update-Database まで) してデータベース作成
OK なこれからの手順
Install-Package EntityFramework.ja
- DbContext クラスを作成
- スキャフォールディングでコントローラー作成
- マイグレーション (Update-Database まで) してデータベース作成
DbContext クラスは、Entity Framework パッケージが必要となりますけれども、認証のないプロジェクトを作成した時点では未インストール状態でしたの。これは存じませんでした。
てっきり自動的に入るものと思い込んでおりましたので、DbContext クラスを作成した時にコンパイルエラーとなって少し驚きました。
また、この手順で最後まで進めることができ、スキャフォールディングでもエラーとなりませんでした!
ウェブアプリとしても操作できました。けれども、おかしな部分もありました><。これは、まえからそうであったのか、新たに発生したのか、ちょっとわかりません。。。
- Children/Edit で、Parent が null なために更新できなかった。
DbContext クラス作成後にスキャフォールディングできるかも。
自分で追加で書くこととなったコード
以前はスキャフォールディング時に自動的に生成・編集されておりました部分ですの。
public class ApplicationDbContext : DbContext { public ApplicationDbContext() : base("name=ApplicationDbContext") { } public static ApplicationDbContext Create() { return new ApplicationDbContext(); } public DbSet<Child> Children { get; set; } public DbSet<Parent> Parents { get; set; } public DbSet<Sex> Sexes { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Parent>() .HasRequired(c => c.Sex) .WithMany() .WillCascadeOnDelete(false); modelBuilder.Entity<Child>() .HasRequired(c => c.Sex) .WithMany() .WillCascadeOnDelete(false); } }
<configuration> <configSections> ... 略 ... </configSections> <connectionStrings> <add name="ApplicationDbContext" connectionString="Data Source=(localdb)\MSSQLLocalDB; Initial Catalog=ApplicationDb; Integrated Security=True; MultipleActiveResultSets=True; AttachDbFilename=|DataDirectory|ApplicationDb.mdf" providerName="System.Data.SqlClient" /> </connectionStrings>
関係無かったけれども、他の試行錯誤
解決した今となっては、不要な対処ですけれども、コードにバグが潜んでおり、それが牙を向いたのでは!?という可能性も考えて次のことを試してみました。
結論から言えば、関係ありませんでした♪
キー周りで問題が起きておりますので、モデルのナビゲーションプロパティ (今回で言えば、Children モデルクラスの Parent プロパティなどのこと) に ForeignKey 属性を加えてみましたの。
- 実践 Entity Framework ~ ForeignKey 属性 – インクリメンタルなカイハツにっき
> ForeignKey 属性の引数には、外部キーとなるプロパティ名を指定します。
結果は、問題解決できませんでした><。
この後で、作業の順番を変える方法でエラーを回避できるようになりました。
したがって、ForeignKey 属性を付ける作業はいらないかもと思い、確かめてみましたら実際のところ不要でしたの♪
おわりに
課題はまだ残りましたけれども、ひとまずこれでサンプルプロジェクトを土台に様々なことを試すことができますわ♪
以上です。