我在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; }
}
您可以尝试添加客户
public virtual ICollection<Consignment> Consignments { get; set; }
并改为
HasRequired(x => x.Customer)
.WithMany(x=>x.Consignments)
.HasForeignKey(x => x.CustomerId);