3

Customer と Email の 2 つのエンティティがあります。重要なものだけを表示するためにそれらを取り除いています。

public class Customer
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    [StringLength(6)]
    public string Id { get; set; }

    [Required]
    [StringLength(50)]
    public string Name { get; set; }

    //Relationships
    public ICollection<Email> MainEmails { get; set; }
    public ICollection<Email> OrderEmails { get; set; }
    public ICollection<Email> InvoiceEmails { get; set; }
    public ICollection<Email> APEmails { get; set; }
}

public class Email
{
    [Key]
    [StringLength(50)]  
    public string Address { get; set; }

    public ICollection<Customer> MainCustomers { get; set; }
    public ICollection<Customer> OrderCustomers { get; set; }
    public ICollection<Customer> InvoiceCustomers { get; set; }
    public ICollection<Customer> APCustomers { get; set; }
}

コンテキスト クラスで OnModelCreating() をオーバーライドすると、次のものが含まれます。

modelBuilder.Entity<Customer>()
    .HasMany(e => e.MainEmails)
    .WithMany(c => c.MainCustomers)
    .Map(m =>
    {
        m.ToTable("CustomerMainEmails");
        m.MapLeftKey("CustomerId");
        m.MapRightKey("Address");
    });

modelBuilder.Entity<Customer>()
    .HasMany(e => e.OrderEmails)
    .WithMany(c => c.OrderCustomers)
    .Map(m =>
    {
        m.ToTable("CustomerOrderEmails");
        m.MapLeftKey("CustomerId");
        m.MapRightKey("Address");
    });

modelBuilder.Entity<Customer>()
    .HasMany(e => e.InvoiceEmails)
    .WithMany(c => c.InvoiceCustomers)
    .Map(m =>
    {
        m.ToTable("CustomerInvoiceEmails");
        m.MapLeftKey("CustomerId");
        m.MapRightKey("Address");
    });

modelBuilder.Entity<Customer>()
    .HasMany(e => e.APEmails)
    .WithMany(c => c.APCustomers)
    .Map(m =>
    {
        m.ToTable("CustomerAPEmails");
        m.MapLeftKey("CustomerId");
        m.MapRightKey("Address");
    });

これは正常に機能し、DB、Customers、Emails、および 4 つの M2M テーブル、CustomerAPEmails、CustomerInvoiceEmails、CustomerMainEmails、および CustomerOrderEmails に 5 つのテーブルを作成します。

ここで、Email エンティティの名前を CustomerEmail に変更して移行を実行しようとすると、移行の最初の数行は次のようになります。

RenameTable(name: "dbo.CustomerMainEmails", newName: "CustomerEmails");
DropForeignKey("dbo.CustomerMainEmails", "CustomerId", "dbo.Customers");
DropForeignKey("dbo.CustomerMainEmails", "Address", "dbo.Emails");
DropForeignKey("dbo.CustomerOrderEmails", "CustomerId", "dbo.Customers");

update-database を実行すると、次のエラーで失敗します。

System.Data.SqlClient.SqlException (0x80131904): オブジェクト "dbo.CustomerMainEmails" が存在しないか、権限がないため、見つかりません。

その理由は、テーブルの名前が変更され、存在しないテーブルにキーを削除しようとしたためだと思います。これは私には間違っているようです。バグですか?そもそも dbo.CustomerMainEmails テーブルの名前を変更するのはなぜですか?

4

1 に答える 1

1

RenameTable()以下のメソッドを移動してみてください

DropForeignKey("dbo.CustomerMainEmails", "CustomerId", "dbo.Customers");
DropForeignKey("dbo.CustomerMainEmails", "Address", "dbo.Emails");
DropForeignKey("dbo.CustomerOrderEmails", "CustomerId", "dbo.Customers");
RenameTable(name: "dbo.CustomerMainEmails", newName: "CustomerEmails");
于 2013-03-18T15:33:52.470 に答える