PM コンソールを介した自動移行を使用して、最初に EF 5.0 コードを使用しています。
プロジェクトに 4 回目の移行を適用しようとしていますが、リンク テーブルの命名規則に基づいているため、テーブルが削除され、別の名前で再作成されています。これは、以前の移行では発生していません。
例 :
User と Site の 2 つのクラスがあります。
InitialCreate マイグレーション
これにより、慣例により「UserSites」と呼ばれるリンク テーブルが作成されました。
CreateTable(
"dbo.UserSites",
c => new
{
User_Id = c.Guid(nullable: false),
Site_Id = c.Guid(nullable: false),
})
.PrimaryKey(t => new { t.User_Id, t.Site_Id })
.ForeignKey("dbo.Users", t => t.User_Id, cascadeDelete: true)
.ForeignKey("dbo.Sites", t => t.Site_Id, cascadeDelete: true)
.Index(t => t.User_Id)
.Index(t => t.Site_Id);
すべてがうまく機能します。
今日にスキップ:
4回目の移行
これにより、UserSites リンク テーブルが削除され、SiteUsers リンク テーブルが作成されます。
明らかに理想的ではありません!
public override void Up()
{
DropForeignKey("dbo.UserSites", "User_Id", "dbo.Users");
DropForeignKey("dbo.UserSites", "Site_Id", "dbo.Sites");
DropIndex("dbo.UserSites", new[] { "User_Id" });
DropIndex("dbo.UserSites", new[] { "Site_Id" });
CreateTable(
"dbo.SiteUsers",
c => new
{
Site_Id = c.Guid(nullable: false),
User_Id = c.Guid(nullable: false),
})
.PrimaryKey(t => new { t.Site_Id, t.User_Id })
.ForeignKey("dbo.Sites", t => t.Site_Id, cascadeDelete: true)
.ForeignKey("dbo.Users", t => t.User_Id, cascadeDelete: true)
.Index(t => t.Site_Id)
.Index(t => t.User_Id);
DropTable("dbo.UserSites");
私はこれを説明するのに途方に暮れています。
最初の実装以来、どちらのクラスも変更されていません...これを適用すると、データが失われると思います。
だから質問に:
このコードを移行スクリプトから削除して、既存の構造を引き続き使用できますか?
これを引き起こした可能性のある、私が知らない落とし穴はありますか?
あらゆる/すべての支援に感謝します!
編集:
以下のようにクラスを単純に定義し、慣例に従ってモデルを構築できるようにしました。dbcontext の名前空間を変更しましたが、それだけです。私を当惑させてください。
public class User
{
public virtual ICollection<Site> Sites { get; set; }
}
public class Site
{
public virtual ICollection<User> Users { get; set; }
}