1

関係を持つ 2 つのモデルを取得しました。

public class Customer
{
    public Customer()
    {
        CustomerSites = new List<CustomerSite>();
    }     

    public IList<CustomerSite> CustomerSites { get; set; }
}

public class CustomerSite
{
    public Guid CustomerId { get; set; }
    public Customer Customer { get; set; }
}

関係は流暢なAPIによって構築されます:(私は以下のステートメントの1つだけでも試しました)

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        modelBuilder.Entity<CustomerSite>()
            .HasRequired(x => x.Customer)
            .WithMany(x => x.CustomerSites)
            .HasForeignKey(x => x.CustomerId);

        modelBuilder.Entity<Customer>()
            .HasMany(x => x.CustomerSites)
            .WithRequired(x => x.Customer)
            .HasForeignKey(x => x.CustomerId);
}

私の質問は、このコードが以下の例のようにデータベースへの二重外部キーを生成する理由です。

 "dbo.CustomerSites",
            c => new
                {                     
                    CustomerId = c.Guid(nullable: false),                     
                    Customer_Id = c.Guid(),
                })
            .ForeignKey("dbo.Customers", t => t.CustomerId, cascadeDelete: true)
            .ForeignKey("dbo.Customers", t => t.Customer_Id)

Customer_Id ではなく、1 つの CustomerId のみである必要があります。ご覧のとおり、これも nullable です。データベースコンテキストでこの列を削除すると、更新時に例外がスローされます。これはかなり怪しいと思います……。

4

1 に答える 1

1

その理由は、リファクタリング中に一部の古いプロパティがエンティティに残され、DB 内の追加の FK の自動マッピング中に影響を受けたためです。

例:私たちが持っている場合

public class CustomerSite
{
    public Guid CustomerId { get; set; }
    public Customer Customer { get; set; }
    ............
    public Customer Customer1 { get; set; }
}

次のような流暢なマッピングステートメントが1つだけあります

modelBuilder.Entity<CustomerSite>().HasRequired(x => x.Customer)
.WithMany(x => x.CustomerSites).HasForeignKey(x => x.CustomerId);

データベースには、null 可能になる Customer1_Id のような追加の FK があります。

行き届きます。それは誰かを助けるかもしれません!!!

于 2014-01-11T09:02:18.187 に答える