实体框架HasForeignKey不起作用

问题描述 投票:0回答:1

我在EF 6.2中遇到了HasForeignKey的奇怪行为。

Class Consignment有两个属性Customer和Sender:

public class Consignment
{
    public Consignment()
    {
        Sender = new Sender();
        Customer = new Customer();
    }

    public string OrderNo { get; set; }

    public Customer Customer { get; set; }
    public Sender Sender { get; set; }

    public int CustomerId { get; set; }
}

CustomerId是客户的外键。实体配置如下:

    public class ConsignmentEntityConfiguration : EntityTypeConfiguration<Consignment>
{
    public ConsignmentEntityConfiguration()
    {
        HasKey(s => s.OrderNo);

        HasRequired(x => x.Customer)
            .WithMany()
            .HasForeignKey(x => x.CustomerId);

        HasRequired(x => x.Sender)
            .WithMany()
            .Map(x => x.MapKey("SenderId"));
    }
}

public class SenderEntityConfiguration : EntityTypeConfiguration<Sender>
{
    public SenderEntityConfiguration()
    {
        HasKey(x => x.Number);
    }
}

public class CustomerEntityConfiguration : EntityTypeConfiguration<Customer>
{
    public CustomerEntityConfiguration()
    {
        HasKey(x => x.Id);
    }
}

Customer ans Sender几乎完全相同,但Customer配置了HasForeignKey属性,Sender配置了Map属性。

所以,当我从db获取寄售时,就像在查询中一样

var consignment = context.Set<Consignment>().Include(x => x.Customer).Include(x => x.Sender).FirstOrDefault();

我收到货物发件人的货物,但空客户(所有物业为空或空)。渴望,懒惰和显式加载产生相同的结果。

SQL Server正常获取并投影客户,但EF返回空客户(如新客户()之后)

因此,当我从模型中删除CustomerId属性,并使用.Map配置Customer时,一切都很完美。

         HasRequired(x => x.Customer)
            .WithMany()
            .Map(x => x.MapKey("CustomerId"));

当我在新的测试项目中重新创建相同的模型(使用简单的类)时,HasForeignKey按预期工作。

我在原始项目中缺少什么?类很简单,我检查了所有配置,原始项目和测试项目看起来一样,但工作方式不同......

稍微简化的课程:

public class Sender
{
    public string Number { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }
}
public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
    public string MobilePhone { get; set; }
}
c# entity-framework ef-fluent-api
1个回答
0
投票

您可以尝试添加客户

public virtual ICollection<Consignment> Consignments { get; set; }

并改为

HasRequired(x => x.Customer)
            .WithMany(x=>x.Consignments)
            .HasForeignKey(x => x.CustomerId);
© www.soinside.com 2019 - 2024. All rights reserved.