0

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");

私はこれを説明するのに途方に暮れています。

最初の実装以来、どちらのクラスも変更されていません...これを適用すると、データが失われると思います。

だから質問に:

  1. このコードを移行スクリプトから削除して、既存の構造を引き続き使用できますか?

  2. これを引き起こした可能性のある、私が知らない落とし穴はありますか?

あらゆる/すべての支援に感謝します!

編集:

以下のようにクラスを単純に定義し、慣例に従ってモデルを構築できるようにしました。dbcontext の名前空間を変更しましたが、それだけです。私を当惑させてください。

public class User
{
   public virtual ICollection<Site> Sites { get; set; }
}

public class Site
{
    public virtual ICollection<User> Users { get; set; }
}
4

1 に答える 1

0

奇妙な状況です。で何か変更しましたDbContextか? クラスでどのように宣言しSites、プロパティを作成しますか?Users

次のように、db コンテキストに多対多の関係を明示的に追加する必要があると思います。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<User>()
                .HasMany<Sites>(u => u.Sites)
                .WithMany(e => e.Users)
                .Map(
                    m =>
                        {
                            m.MapLeftKey("User_Id");
                            m.MapRightKey("Site_Id");
                            m.ToTable("UserSites");
                        });

    //for prevent error 'The referential relationship will result in a cyclical reference that is not allowed'
    modelBuilder.Entity<Sites>()
                .HasRequired(s => s.User)
                .WithMany()
                .WillCascadeOnDelete(false);
}

次に、4 番目の移行を削除して、もう一度追加してみてください

移行コードを削除すると、外部キーの問題、間違ったテーブル名などのナビゲーション エラーが発生します。

于 2013-04-18T06:29:03.563 に答える