asp.net - EF 使用代码优先和一对多关系创建重复的外键

标签 asp.net asp.net-mvc entity-framework ef-code-first

我使用以下类来建立一对多关系:

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 关系的字段,称为Supplier_SupplierId,并且该字段为NULL。我不确定我是否理解为什么在“联系人”表上创建“Supplier_SupplierId”,因为“SupplierId”应该用作外键,而这只是多余的。如果我尝试访问已成功添加联系人的供应商的联系人集合,该集合将返回空,因为 Contact.Supplier_SupplierId 为 NULL。但是,如果我将SupplierId 列中的值复制到联系人记录的Supplier_SupplierId 列中,Supplier.Contacts 将带回联系人。

这就是我的“联系人”表的最终样子:

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?

最佳答案

此映射是错误的(我指的是您问题下面的评论):

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 视为导航属性,该属性属于 SupplierContact 之间的另一个一对多关系> - 这就引入了第二个外键。

关于asp.net - EF 使用代码优先和一对多关系创建重复的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11572801/

相关文章:

asp.net-mvc - DotNetOpenAuth WebConsumer 未重定向到 ASP.NET MVC 应用程序中的 OAuth 提供程序

ASP.Net + MVC + VS 2008

c# - 一种搜索实体的方法,该实体的某个属性与 Entity Framework 中的给定条件匹配

c# - System.Data.SQLite 无法加载扩展

c# - MVC - 给定路由名称,我可以获得默认操作名称和 Controller 名称吗?

c# - 在 asp.net mvc 中的 javascript block 中获取特殊字符时进行转换

.net - 为什么我的自定义 HttpResponse 在 HttpResponse.End() 上抛出异常?

c# - MVC 中的嵌套 ViewModels/部分 View 问题

c# - EF6 异步方法困惑

c# - 如何验证IList外键? Entity Framework