加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – EF首先使用代码与一对多关系创建重复的外键

发布时间:2020-12-16 07:04:53 所属栏目:asp.Net 来源:网络整理
导读:我正在使用以下类来实现一对多关系: 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;
我正在使用以下类来实现一对多关系:

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,在创建新的Contact时,SupplierId在查询字符串中传递并作为隐藏字段添加到Contact create表单:

@Html.HiddenFor(model => model.SupplierId)

这将成功创建联系人,并使用查询字符串中的Guid填充Contact的SupplierId字段.但是,问题是Contacts表有另一个名为Supplier_SupplierId的虚拟供应商关系字段,该字段为NULL.我不确定我是否理解为什么甚至在Contacts表上创建Supplier_SupplierId,因为SupplierId应该被用作外键,这只是多余的.如果我尝试访问供应商的Contacts集合,我成功添加了Contact,则集合将返回空,因为Contact.Supplier_SupplierId为NULL.但是,如果我将SupplierId列中的值复制到Contact记录的Supplier_SupplierId列中,则Supplier.Contacts将返回Contact.

这是我的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视为属于供应商和联系人之间的另一个和第二个一对多关系的导航属性,并引入第二个外键.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读