5

请检查下面可能的解决方案部分

我的外键关系有问题 - 这是我的表:

public class Lead
{
    [Key]
    public int LeadId { get; set; }
    public int? CustomerId { get; set; }

    [ForeignKey("CustomerId")]
    public virtual Customer Customer { get; set; }
 }

public class Customer
{
    [Key]
    [Column("customer_id")]
    public int CustomerId { get; set; }

    [ForeignKey("CustomerId")]
    public virtual Lead Lead { get; set; }

}

我在收到此错误时遇到问题:

Unable to determine the principal end of an association between the types 'Sales.Customers.Customer' and 'Sales.Leads.Lead'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.

我已经尝试将关系添加到模型构建器,但它似乎无法正常工作。当我确实收到错误消息时,它实际上使用的Lead.LeadId -> Customer.CustomerId是关系而不是Lead.CustomerId -> Customer.CustomerId关系。

我在 Stackoverflow 上检查了类似的问题,但它们似乎与我的数据库结构不匹配,当我尝试实施他们的建议时,这种关系仍然无法正常工作。

它真的很奇怪 - 非常感谢您的帮助!

更新

因此,在我试图让这种关系发挥作用的过程中,我通过以下方式切换了键:

public class Lead
{
    [Key]
    public int LeadId { get; set; }

    [ForeignKey("LeadId")]
    public virtual Customer Customer { get; set; }
}

public class Customer
{
    [Key]
    [Column("customer_id")]
    public int CustomerId { get; set; }
    public int? LeadId { get; set; }

    [ForeignKey("LeadId")]
    public virtual Lead Lead { get; set; }
}

但是,同样的错误,仍然没有运气 - 我真的不知道为什么这种关系不起作用。对我来说,这似乎很简单。

更新 2

好的 - 在浪费了大量时间后,我尝试了一种稍微不同的方法:

这是我的新课程......

    public class Lead
    {
        [Key, ForeignKey("Customer")]
        public int LeadId { get; set; }
        public virtual Customer Customer { get; set; }
    }

    public class Customer
    {
        [Key]
        [Column("customer_id")]
        public int CustomerId { get; set; }
        public int? LeadId { get; set; }
        public virtual Lead Lead { get; set; }
     }

上面的代码不再有错误消息!唯一的问题是正在创建的关系实体框架是在 Customer.CustomerId 和 Lead.LeadId 之间,而不是在 Customer.LeadId 和 Lead.LeadId 之间——我觉得我很接近!

可能的解决方案

好的 - 所以经过更多研究后,我在这里看到了这篇文章: EF Code First - 1-to-1 Optional Relationship

我将我的课程修改为:

public class Customer
{
    [Key]
    [Column("customer_id")]
    public int CustomerId { get; set; }

    public virtual Lead Lead { get; set; }
}

public class Lead
{
    [Key]
    public int LeadId { get; set; }
    public virtual Customer Customer { get; set; }
 }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Customer>().HasOptional<Lead>(l => l.Lead).WithOptionalDependent(c => c.Customer).Map(p => p.MapKey("LeadId"));
    base.OnModelCreating(modelBuilder);
}

一切都很好!但是一个大问题...

我必须从客户表中删除 LeadId 属性....所以现在我不确定如果没有要分配的 LeadId 属性,在创建新客户时(在适当时)如何分配 LeadId?

4

1 回答 1

2

将其发布在流利的 API 中,它应该可以工作。

public class Lead
{
    [Key]
    public int LeadId { get; set; }

    public virtual Customer Customer { get; set; }
 }

public class Customer
{
    [Key]
    [Column("customer_id")]
    public int CustomerId { get; set; }

    public virtual Lead Lead { get; set; }
}

builder.Entity<Lead>()
.HasOptional(l => l.Customer)
.WithOptionalPrincipal()
.Map(k => k.MapKey("LeadId"));

builder.Entity<Customer>()
.HasOptional(c => c.Lead)
.WithOptionalPrincipal()
.Map(k => k.MapKey("CustomerId"));

编辑

表

于 2013-07-16T12:37:06.403 回答