我将以下类用于一对多关系:
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)
这将成功创建联系人并使用查询字符串中的 Guid 填充联系人的 SupplierId 字段。但是,问题在于 Contacts 表有另一个名为 Supplier_SupplierId 的虚拟供应商关系字段,该字段为 NULL。我不确定我是否理解为什么会在 Contacts 表上创建 Supplier_SupplierId,因为 SupplierId 应该用作外键,而这只是多余的。如果我尝试访问已成功添加联系人的供应商的联系人集合,则该集合返回为空,因为 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?