移行で Entity Framework 5 を使用しています。私のモデルは次のようになります。
UserRegistration
Sessions
登録ごとに、多くのセッションが存在する可能性があります。移行を実行しようとしたときに SQL カスケード削除エラーに問題があったため、次のコードを追加してカスケード削除を削除しようとしました。
modelBuilder.Entity<UserRegistration>()
.HasOptional(x => x.Sessions)
.WithMany()
.WillCascadeOnDelete(false);
EF を知っている場合は、そのコードでエラーを確認できます。UserRegistrations から Sessions への 1 対多の関係を与えていると思っていましたが、実際にはこのコードは「各 UserRegistration にはオプションの Session があり、各 Session には多くの UserRegistrations があります」と言っています。そのため、私の 1 対多の関係は間違った方向に進んでいました。これは私が追加したコードであるべきだったと思います。
modelBuilder.Entity<UserRegistration>()
.HasMany(x => x.Sessions)
.WithRequired(x => x.UserRegistration)
.WillCascadeOnDelete(false);
ただし、悪いコード (上記の最初のブロック) を削除して add-migration を実行すると、次のようになります。
public override void Up()
{
DropForeignKey("dbo.UserRegistrations", "Sessions_Id", "dbo.UserRegistrationSessions");
DropIndex("dbo.UserRegistrations", new[] { "Sessions_Id" });
RenameColumn(table: "dbo.UserRegistrationSessions", name: "Sessions_Id", newName: "UserRegistration_Id");
}
最初の 2 行 (DropForeignKey と DropIndex) は適切に見えます。これは、UserRegistrations テーブルから外部キーを削除しています。ただし、3行目はどこからともなく出てきます。UserRegistrationSessions テーブルに Sessions_Id 列はありません。実行すると、エラーが発生すると予想されます。
Either the parameter @objname is ambiguous or the claimed @objtype (COLUMN) is wrong.
モデルとモデルビルダー コードの間に何か問題があると思います。修正を進める前に、モデルが正しくないように見えるようにする必要があるかもしれませんが、モデルビルダーのコードを一致させる必要があります。
私のモデルの関連コードは次のとおりです。
public class UserRegistration
{
public int Id { get; set; }
public virtual ICollection<UserRegistrationSession> Sessions { get; set; }
}
public class UserRegistrationSession
{
public int Id { get; set; }
public virtual UserRegistration UserRegistration { get; set; }
}