5

私は1対多の関係のために次のクラスを使用しています:

public class Supplier
{
    public Supplier()
    {
        SupplierId = Guid.NewGuid();
    }

    public Guid SupplierId { get; set; }
    [Required]
    public string Name { get; set; }

    [Required]
    public virtual Address Address { get; set; }

    public virtual ICollection<Contact> Contacts { get; set; }
}

public class Contact
{
    public Contact()
    {
        ContactId = Guid.NewGuid();
    }

    public Guid ContactId { get; set; }

    [Required]
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }

    [Required]
    public Guid SupplierId { get; set; }
    [ForeignKey("SupplierId")]
    public virtual Supplier Supplier { get; set; }
}

ASP.NET MVC 4を使用しており、新しい連絡先を作成すると、SupplierIdがクエリ文字列で渡され、非表示フィールドとして連絡先作成フォームに追加されます。

@Html.HiddenFor(model => model.SupplierId)

これにより、連絡先が正常に作成され、連絡先のSupplierIdフィールドにクエリ文字列のGuidが入力されます。ただし、問題は、ContactsテーブルにSupplier_SupplierIdと呼ばれる仮想Supplierリレーションシップの別のフィールドがあり、このフィールドがNULLであるということです。なぜSupplier_SupplierIdがContactsテーブルに作成されているのかわかりません。これは、SupplierIdを外部キーとして使用する必要があり、これは冗長になるためです。連絡先を正常に追加したサプライヤのContactsコレクションにアクセスしようとすると、Contact.Supplier_SupplierIdがNULLであるため、コレクションは空に戻ります。ただし、SupplierId列からContactレコードのSupplier_SupplierId列に値をコピーすると、Supplier.ContactsはContactを戻します。

これが私の連絡先テーブルのようになります。

CREATE TABLE [dbo].[Contacts] (
    [ContactId]           UNIQUEIDENTIFIER NOT NULL,
    [FirstName]           NVARCHAR (MAX)   NOT NULL,
    [LastName]            NVARCHAR (MAX)   NOT NULL,
    [Supplier_SupplierId] UNIQUEIDENTIFIER NULL,
    CONSTRAINT [PK_dbo.Contacts] PRIMARY KEY CLUSTERED ([ContactId] ASC),
    CONSTRAINT [FK_dbo.Contacts_dbo.Suppliers_SupplierId] FOREIGN KEY ([SupplierId]) REFERENCES [dbo].[Suppliers] ([SupplierId]),
    CONSTRAINT [FK_dbo.Contacts_dbo.Suppliers_Supplier_SupplierId] FOREIGN KEY ([Supplier_SupplierId]) REFERENCES [dbo].[Suppliers] ([SupplierId])
);

サプライヤへの2つの外部キーが連絡先に作成されている理由を誰かが知っていますか?サプライヤーへの唯一の外部キーがSupplierIdになるように変更するにはどうすればよいですか?

4

1 に答える 1

6

このマッピングは間違っています(私はあなたの質問の下にあるあなたのコメントを参照しています):

modelBuilder.Entity<Contact>()
    .HasRequired(r => r.Supplier)
    .WithMany()
    .HasForeignKey(f => f.SupplierId)
    .WillCascadeOnDelete(false);

必要なもの:

modelBuilder.Entity<Contact>()
    .HasRequired(r => r.Supplier)
    .WithMany(s => s.Contacts)
    .HasForeignKey(f => f.SupplierId)
    .WillCascadeOnDelete(false);

それ以外の場合、EFはSupplier.Contacts、との間の別の2番目の1対多の関係に属し、2番目の外部キーを導入するナビゲーションプロパティSupplierContact見なします。

于 2012-07-20T12:27:51.507 に答える