Entity.HasRequired返回具有NULL属性的项目

时间:2017-04-20 16:40:03

标签: c# entity-framework

我有两个相关实体已构建并与Fluent API链接。

public class EDeal : IEntityBase
{
    public int ID { get; set; }
    public string Customer_id { get; set; }
    public virtual ECustomer Customer { get; set; }
    ...etc
}

public class ECustomer : IEntityBase
{
    public int ID { get; set; }
    public string Customer_id { get; set; }
    public string Customer_name { get; set; }
    public virtual ICollection<EDeal> Deals { get; set; }
    ...etc
}

相关联
modelBuilder.Entity<ECustomer>().HasKey(c => c.Customer_id);
modelBuilder.Entity<EDeal>().HasRequired<ECustomer>(s => s.Customer)
    .WithMany(r => r.Deals)
    .HasForeignKey(s => s.Customer_id);

我认识到这是低效率的链接,但我必须以这种方式链接它,因为我无法控制数据库结构。

需要注意的重要一点是,EDeal需要一个ECustomer(.HasRequired)。数据库在EDeal中包含许多行,它们具有null Customer_id字段,我不想在查询实体时拉这些行。

我认为.HasRequired会确保我从未找回任何没有与他们相关的ECustomer的EDeals,但似乎并非如此。相反,当我尝试按Customer中的属性进行排序时,它似乎只忽略具有NULL Customer_id值的那些行。即便如此,返回查询的.Count()行为也很奇怪。

var count1 = db.Set<EDeal>().Count(); //returns 1112
var count2 = db.Set<EDeal>().ToList().Count(); //returns 1112
var count3 = db.Set<EDeal>().OrderBy(c => c.Customer.Customer_name).Count(); //returns 1112
var count4 = db.Set<EDeal>().OrderBy(c => c.Customer.Customer_name).ToList().Count(); //returns 967

我知道我可以添加.Where(c =&gt; c.Customer.Customer_id!= Null)以确保我只回到我正在寻找的东西,但我希望在实体中找到解决方案配置,因为我有许多泛型函数作用于我的IEntityBase类,它在通用实体上构建动态查询,我不想在这种情况下使用解决方法。

问题:

1)有没有办法限制实体只返回那些拥有相应ECustomer的EDeals?

2)在上面的例子中,为什么count3和count4不同?

提前致谢。

0 个答案:

没有答案