Я использую следующие классы для отношений от одного -до -многих:
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 из строки запроса. Однако проблема заключается в том, что в таблице «Контакты» есть другое поле для виртуального отношения «Поставщик», которое называется «Поставщик» _SupplierId, и это поле имеет значение NULL. Я не уверен, что понимаю, почему Supplier _SupplierId вообще создается в таблице «Контакты», так как SupplierId должен использоваться в качестве внешнего ключа, и это было бы просто избыточным. Если я попытаюсь получить доступ к коллекции контактов поставщика, к которому я успешно добавил контакт, коллекция вернется пустой, поскольку Contact.Supplier _SupplierId имеет значение NULL. Однако,если я скопирую значение из столбца SupplierId в столбец Supplier _SupplierId записи Contact, 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?