私は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になるように変更するにはどうすればよいですか?