EF сначала использует код с одним отношением -— -со многими, создающими дубликаты внешних ключей

Я использую следующие классы для отношений от одного -до -многих:

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?

5
задан Matt Jonker 20 July 2012 в 04:13
поделиться